Hướng dẫn dùng sizeof python 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. Show Nội dung chính
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. Một câu trả lời đầy đủ hơnSử 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ữ): Con trăn 3:
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 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ó 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ỏ. 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 Phân tích Python 2.7, được xác nhận với
Lưu ý rằng từ điển ( nhưng không phải bộ ) có biểu diễn nhỏ gọn hơn trong Python 3.6 Tôi nghĩ 8 byte cho mỗi mục bổ sung để tham khảo có ý nghĩa rất lớn trên máy 64 bit. 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ự. (Và để biết thêm về các vị trí, xem câu trả lời này ) Một chức năng hoàn chỉnh hơnChúng tôi muốn một chức năng tìm kiếm các thành phần trong danh sách, bộ dữ liệu, bộ, Chúng
tôi muốn dựa vào Các lớp, mô-đun và hàm là các singletons - chúng tồn tại một lần trong bộ nhớ. 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 sẽ sử dụng một danh sách đen các loại vì vậy chúng tôi không bao gồm toàn bộ chương trình trong số lượng kích thước của chúng tôi.
Để đối chiếu điều này với chức năng được liệt kê trong danh sách trắng sau đây, hầu hết các đối tượng đều biết cách tự tìm kiếm mục đích của việc thu gom rác (đó là khoảng những gì
chúng ta đang tìm kiếm khi chúng ta muốn biết các đối tượng nhất định đắt tiền như thế nào. Ví dụ, các hàm biết khá nhiều về các mô-đun mà chúng được tạo. Một điểm tương phản khác là các chuỗi là các khóa trong từ điển thường được thực hiện để chúng không bị trùng lặp.
Kiểm tra Các loại danh sách trắng, khách truy cập đệ quy (triển khai cũ)Để tự mình bao quát hầu hết các loại này, thay vì dựa vào mô đun gc, tôi đã viết hàm đệ quy này để cố gắng ước tính kích thước của hầu hết các đối tượng Python, bao gồm hầu hết các nội dung, loại trong mô đun bộ sưu tập và các loại tùy chỉnh (có rãnh và mặt 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:
Và tôi đã thử nghiệm nó khá tình cờ (tôi nên bỏ qua nó):
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ẻ |