Hướng dẫn python sys getsizeof - python sys getizeof

Làm cách nào để xác định kích thước của một đối tượng trong Python?

Câu trả lời, "Chỉ cần sử dụng sys.getsizeof" không phải là một câu trả lời hoàn chỉnh.

Nội dung chính

  • Làm cách nào để xác định kích thước của một đối tượng trong Python?
  • Một câu trả lời đầy đủ hơn
  • Một chức năng hoàn chỉnh hơn
  • Các loại danh sách trắng, khách truy cập đệ quy (triển khai cũ)

Nội dung chính

  • Làm cách nào để xác định kích thước của một đối tượng trong Python?
  • Một câu trả lời đầy đủ hơn
  • Một chức năng hoàn chỉnh hơn
  • Các loại danh sách trắng, khách truy cập đệ quy (triển khai cũ)

Nội dung chính

  • Làm cách nào để xác định kích thước của một đối tượng trong Python?
  • Một câu trả lời đầy đủ hơn
  • Một chức năng hoàn chỉnh hơn
  • Các loại danh sách trắng, khách truy cập đệ quy (triển khai cũ)

Nội dung chính

  • Làm cách nào để xác định kích thước của một đối tượng trong Python?
  • Một câu trả lời đầy đủ hơn
  • Một chức năng hoàn chỉnh hơn
  • Các loại danh sách trắng, khách truy cập đệ quy (triển khai cũ)

Câu trả lời đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.

Một câu trả lời đầy đủ hơn

Một chức năng hoàn chỉnh hơn

Các loại danh sách trắng, khách truy cập đệ quy (triển khai cũ)

Empty
Bytes  type        scaling notes
28     int         +4 bytes about every 30 powers of 2
37     bytes       +1 byte per additional byte
49     str         +1-4 per additional character (depending on max width)
48     tuple       +8 per additional item
64     list        +8 for each additional
224    set         5th increases to 736; 21nd, 2272; 85th, 8416; 341, 32992
240    dict        6th increases to 368; 22nd, 1184; 43rd, 2280; 86th, 4704; 171st, 9320
136    func def    does not include default args and other attrs
1056   class def   no slots 
56     class inst  has a __dict__ attr, same scaling as dict above
888    class def   with slots
16     __slots__   seems to store in mutable tuple-like structure
                   first slot grows to 48, and so on.

Câu trả lời đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.Vâng, nói rằng bạn có một bộ với 10 mục trong đó. Nếu mỗi mục là 100 byte, thì toàn bộ cấu trúc dữ liệu lớn đến mức nào? Bộ này là 736 vì nó có kích thước một lần lên tới 736 byte. Sau đó, bạn thêm kích thước của các mục, tổng cộng là 1736 byte

Câu trả lời đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.Vâng, nói rằng bạn có một bộ với 10 mục trong đó. Nếu mỗi mục là 100 byte, thì toàn bộ cấu trúc dữ liệu lớn đến mức nào? Bộ này là 736 vì nó có kích thước một lần lên tới 736 byte. Sau đó, bạn thêm kích thước của các mục, tổng cộng là 1736 byte

Sử dụng 64 bit Python 3.6 từ bản phân phối Anaconda, với sys.getsizeof, tôi đã xác định kích thước tối thiểu của các đối tượng sau và lưu ý rằng các tập hợp và dicts không gian preallocate để những cái trống không phát triển lại cho đến sau một lượng đã đặt thay đổi theo cách thực hiện ngôn ngữ):

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
0cấu trúc proxy (48 byte) cho attrs lớp. Mỗi vị trí có một mô tả (như a
Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
1) trong định nghĩa lớp.

Con trăn 3:

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
0cấu trúc proxy (48 byte) cho attrs lớp. Mỗi vị trí có một mô tả (như a
Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
1) trong định nghĩa lớp.Chỉ các đối tượng có rãnh trống mới có 16 byte và một thể hiện không có dữ liệu có ý nghĩa rất nhỏ.

Làm thế nào để bạn giải thích điều này? Vâng, nói rằng bạn có một bộ với 10 mục trong đó. Nếu mỗi mục là 100 byte, thì toàn bộ cấu trúc dữ liệu lớn đến mức nào? Bộ này là 736 vì nó có kích thước một lần lên tới 736 byte. Sau đó, bạn thêm kích thước của các mục, tổng cộng là 1736 byteChỉ các đối tượng có rãnh trống mới có 16 byte và một thể hiện không có dữ liệu có ý nghĩa rất nhỏ.

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
0.

Một số cảnh báo cho các định nghĩa hàm và lớp:

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
0.
Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
5
Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
6:

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.

Lưu ý mỗi định nghĩa lớp có

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
0cấu trúc proxy (48 byte) cho attrs lớp. Mỗi vị trí có một mô tả (như a
Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
1) trong định nghĩa lớp.
Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
5và
Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
6:nhưng không phải bộ ) có biểu diễn nhỏ gọn hơn trong Python 3.6

Các trường hợp có rãnh bắt đầu với 48 byte trên phần tử đầu tiên của chúng và tăng thêm 8 mỗi phần tử. Chỉ các đối tượng có rãnh trống mới có 16 byte và một thể hiện không có dữ liệu có ý nghĩa rất nhỏ.nhưng không phải bộ ) có biểu diễn nhỏ gọn hơn trong Python 3.68 byte đó trỏ đến vị trí trong bộ nhớ của mục được chứa. 4 byte là chiều rộng cố định cho unicode trong Python 2, nếu tôi nhớ chính xác, nhưng trong Python 3, str trở thành một unicode có chiều rộng bằng với chiều rộng tối đa của các ký tự.

Ngoài ra, mỗi định nghĩa hàm có các đối tượng mã, có thể là các tài liệu và các thuộc tính có thể khác, thậm chí là a

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
0.8 byte đó trỏ đến vị trí trong bộ nhớ của mục được chứa. 4 byte là chiều rộng cố định cho unicode trong Python 2, nếu tôi nhớ chính xác, nhưng trong Python 3, str trở thành một unicode có chiều rộng bằng với chiều rộng tối đa của các ký tự.xem câu trả lời này )

Một chức năng hoàn chỉnh hơn

Các loại danh sách trắng, khách truy cập đệ quy (triển khai cũ)

Câu trả lời đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.ký tự, và
Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
1, cũng như những thứ khác mà chúng tôi có thể chưa nghĩ đến.

Câu trả lời đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.Vâng, nói rằng bạn có một bộ với 10 mục trong đó. Nếu mỗi mục là 100 byte, thì toàn bộ cấu trúc dữ liệu lớn đến mức nào? Bộ này là 736 vì nó có kích thước một lần lên tới 736 byte. Sau đó, bạn thêm kích thước của các mục, tổng cộng là 1736 byte

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
2để thực hiện tìm kiếm này vì nó hoạt động ở cấp độ C (làm cho nó rất nhanh). Nhược điểm là get_Vferents có thể trả về các thành viên dư thừa, vì vậy chúng tôi cần đảm bảo chúng tôi không nhân đôi số lượng.để thực hiện tìm kiếm này vì nó hoạt động ở cấp độ C (làm cho nó rất nhanh). Nhược điểm là get_Vferents có thể trả về các thành viên dư thừa, vì vậy chúng tôi cần đảm bảo chúng tôi không nhân đôi số lượng.

Sử dụng 64 bit Python 3.6 từ bản phân phối Anaconda, với sys.getsizeof, tôi đã xác định kích thước tối thiểu của các đối tượng sau và lưu ý rằng các tập hợp và dicts không gian preallocate để những cái trống không phát triển lại cho đến sau một lượng đã đặt thay đổi theo cách thực hiện ngôn ngữ):Chúng tôi không quan tâm đến kích thước của chúng, vì chúng tôi không thể làm gì nhiều về chúng - chúng là một phần của chương trình. Vì vậy, chúng tôi sẽ tránh đếm chúng nếu chúng được tham chiếu.Chúng tôi không quan tâm đến kích thước của chúng, vì chúng tôi không thể làm gì nhiều về chúng - chúng là một phần của chương trình. Vì vậy, chúng tôi sẽ tránh đếm chúng nếu chúng được tham chiếu.

Con trăn 3:

import sys
from types import ModuleType, FunctionType
from gc import get_referents

# Custom objects know their class.
# Function objects seem to know way too much, including modules.
# Exclude modules as well.
BLACKLIST = type, ModuleType, FunctionType


def getsize(obj):
    """sum size of object & members."""
    if isinstance(obj, BLACKLIST):
        raise TypeError('getsize() does not take argument of type: '+ str(type(obj)))
    seen_ids = set()
    size = 0
    objects = [obj]
    while objects:
        need_referents = []
        for obj in objects:
            if not isinstance(obj, BLACKLIST) and id(obj) not in seen_ids:
                seen_ids.add(id(obj))
                size += sys.getsizeof(obj)
                need_referents.append(obj)
        objects = get_referents(*need_referents)
    return size

Làm thế nào để bạn giải thích điều này? Vâng, nói rằng bạn có một bộ với 10 mục trong đó. Nếu mỗi mục là 100 byte, thì toàn bộ cấu trúc dữ liệu lớn đến mức nào? Bộ này là 736 vì nó có kích thước một lần lên tới 736 byte. Sau đó, bạn thêm kích thước của các mục, tổng cộng là 1736 byte

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
2.) Tuy nhiên, biện pháp này sẽ có phạm vi mở rộng hơn nhiều so với dự định của chúng tôi nếu chúng tôi không cẩn thận..) Tuy nhiên, biện pháp này sẽ có phạm vi mở rộng hơn nhiều so với dự định của chúng tôi nếu chúng tôi không cẩn thận.

Một số cảnh báo cho các định nghĩa hàm và lớp:

Lưu ý mỗi định nghĩa lớp có

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
0cấu trúc proxy (48 byte) cho attrs lớp. Mỗi vị trí có một mô tả (như a
Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
1) trong định nghĩa lớp.Kiểm tra Kiểm tra

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.
4cũng sẽ cho phép chúng tôi tránh đếm các bản sao, điều chúng tôi sẽ làm trong phần tiếp theo. Giải pháp danh sách đen bỏ qua các phím đếm hoàn toàn.cũng sẽ cho phép chúng tôi tránh đếm các bản sao, điều chúng tôi sẽ làm trong phần tiếp theo. Giải pháp danh sách đen bỏ qua các phím đếm hoàn toàn.

Các loại danh sách trắng, khách truy cập đệ quy (triển khai cũ)

Câu trả lời đó không hoạt động trực tiếp cho các đối tượng dựng sẵn, nhưng nó không tính đến những gì các đối tượng đó có thể chứa, cụ thể, những loại nào, chẳng hạn như các đối tượng tùy chỉnh, bộ dữ liệu, danh sách, dicts và bộ chứa. Chúng có thể chứa các thể hiện lẫn nhau, cũng như số, chuỗi và các đối tượng khác.

Loại chức năng này cho phép kiểm soát chi tiết hơn nhiều đối với các loại chúng ta sẽ tính cho việc sử dụng bộ nhớ, nhưng có nguy cơ loại bỏ các loại:

import sys
from numbers import Number
from collections import Set, Mapping, deque

try: # Python 2
    zero_depth_bases = (basestring, Number, xrange, bytearray)
    iteritems = 'iteritems'
except NameError: # Python 3
    zero_depth_bases = (str, bytes, Number, range, bytearray)
    iteritems = 'items'

def getsize(obj_0):
    """Recursively iterate to sum size of object & members."""
    _seen_ids = set()
    def inner(obj):
        obj_id = id(obj)
        if obj_id in _seen_ids:
            return 0
        _seen_ids.add(obj_id)
        size = sys.getsizeof(obj)
        if isinstance(obj, zero_depth_bases):
            pass # bypass remaining control flow and return
        elif isinstance(obj, (tuple, list, Set, deque)):
            size += sum(inner(i) for i in obj)
        elif isinstance(obj, Mapping) or hasattr(obj, iteritems):
            size += sum(inner(k) + inner(v) for k, v in getattr(obj, iteritems)())
        # Check for custom object instances - may subclass above too
        if hasattr(obj, '__dict__'):
            size += inner(vars(obj))
        if hasattr(obj, '__slots__'): # can have __slots__ with __dict__
            size += sum(inner(getattr(obj, s)) for s in obj.__slots__ if hasattr(obj, s))
        return size
    return inner(obj_0)

Và tôi đã thử nghiệm nó khá tình cờ (tôi nên bỏ qua nó):

>>> getsize(['a', tuple('bcd'), Foo()])
344
>>> getsize(Foo())
16
>>> getsize(tuple('bcd'))
194
>>> getsize(['a', tuple('bcd'), Foo(), {'foo': 'bar', 'baz': 'bar'}])
752
>>> getsize({'foo': 'bar', 'baz': 'bar'})
400
>>> getsize({})
280
>>> getsize({'foo':'bar'})
360
>>> getsize('foo')
40
>>> class Bar():
...     def baz():
...         pass
>>> getsize(Bar())
352
>>> getsize(Bar().__dict__)
280
>>> sys.getsizeof(Bar())
72
>>> getsize(Bar.__dict__)
872
>>> sys.getsizeof(Bar.__dict__)
280

Việc triển khai này phá vỡ các định nghĩa lớp và định nghĩa hàm vì chúng ta không theo đuổi tất cả các thuộc tính của chúng, nhưng vì chúng chỉ tồn tại một lần trong bộ nhớ cho quy trình, nên kích thước của chúng thực sự không quá quan trọng.

245 hữu ích 3 bình luận chia sẻ 3 bình luận chia sẻ 3 bình luận chia sẻ