Bộ nhớ mặc định được phân bổ cho một số nguyên trong Python là gì?
Python là một ngôn ngữ lập trình tuyệt vời. Nó cũng được biết đến là khá chậm, chủ yếu là do tính linh hoạt và tính năng động rất lớn của nó. Đối với nhiều ứng dụng và miền, đó không phải là vấn đề do yêu cầu của chúng và các kỹ thuật tối ưu hóa khác nhau. Người ta ít biết rằng các biểu đồ đối tượng Python (từ điển lồng nhau của danh sách và bộ dữ liệu và kiểu nguyên thủy) chiếm một lượng bộ nhớ đáng kể. Đây có thể là một yếu tố hạn chế nghiêm trọng hơn nhiều do ảnh hưởng của nó đối với bộ nhớ đệm, bộ nhớ ảo, cho thuê nhiều chương trình khác và nói chung là làm cạn kiệt bộ nhớ khả dụng, vốn là một nguồn tài nguyên khan hiếm và đắt đỏ Show
Hóa ra không khó để tìm ra lượng bộ nhớ thực sự được sử dụng. Trong bài viết này, tôi sẽ hướng dẫn bạn những điều phức tạp trong quản lý bộ nhớ của đối tượng Python và chỉ ra cách đo chính xác bộ nhớ đã sử dụng Trong bài viết này, tôi chỉ tập trung vào CPython—việc triển khai chính của ngôn ngữ lập trình Python. Các thử nghiệm và kết luận ở đây không áp dụng cho các triển khai Python khác như IronPython, Jython và PyPy Tùy thuộc vào phiên bản Python, các con số đôi khi hơi khác một chút (đặc biệt đối với các chuỗi luôn là Unicode), nhưng các khái niệm đều giống nhau. Trong trường hợp của tôi, đang sử dụng Python 3. 10 Kể từ ngày 1 tháng 1 năm 2020, Python 2 không còn được hỗ trợ và bạn nên nâng cấp lên Python 3 Thực hành khám phá cách sử dụng bộ nhớ PythonTrước tiên, hãy khám phá một chút và hiểu cụ thể về việc sử dụng bộ nhớ thực tế của các đối tượng Python Chức năng tích hợp 386Mô-đun sys của thư viện tiêu chuẩn cung cấp chức năng 387. Hàm đó chấp nhận một đối tượng (và mặc định tùy chọn), gọi phương thức 388 của đối tượng và trả về kết quả, vì vậy bạn cũng có thể kiểm tra đối tượng của mình Đo bộ nhớ của các đối tượng PythonHãy bắt đầu với một số loại số 1 import sys 2 3 sys.getsizeof(5) 4 28
Hấp dẫn. Một số nguyên mất 28 byte 1 31____5 import sys0 Hmm… một float mất 24 byte 1 import sys2____5______44 3 import sys6 Ồ. 104 byte. Điều này thực sự khiến bạn phải suy nghĩ xem bạn muốn biểu diễn một số lượng lớn các số thực dưới dạng 389 hay 390 Hãy chuyển sang chuỗi và bộ sưu tập 1 import sys8 2_______50 3 22 4_______54 25 26 27 28 29 30 31 32 33 34 35 36 VÂNG. Một chuỗi trống chiếm 49 byte và mỗi ký tự bổ sung sẽ thêm một byte khác. Điều đó nói lên rất nhiều điều về sự đánh đổi của việc giữ nhiều chuỗi ngắn trong đó bạn sẽ trả 49 byte chi phí cho mỗi chuỗi so với. một chuỗi dài duy nhất mà bạn chỉ trả chi phí chung một lần Đối tượng 391 có tổng phí chỉ 33 byte. 1 38____5 sys.getsizeof(5)0 Hãy nhìn vào danh sách 1 sys.getsizeof(5)2 2 sys.getsizeof(5)4 3 sys.getsizeof(5)6 4_______78 25 40 27 42 29 44 31 46 33 48 35 28
028
128
228
328
4sys.getsizeof(5)8 Chuyện gì đang xảy ra vậy? . Một danh sách chứa một chuỗi dài chỉ chiếm 64 byte Đáp án đơn giản. Danh sách không chứa các đối tượng 392. Nó chỉ chứa một con trỏ 8 byte (trên phiên bản 64-bit của CPython) tới đối tượng thực tế 392. Điều đó có nghĩa là hàm 396 không trả về bộ nhớ thực của danh sách và tất cả các đối tượng mà nó chứa, mà chỉ trả về bộ nhớ của danh sách và các con trỏ tới các đối tượng của nó. Trong phần tiếp theo, tôi sẽ giới thiệu hàm 397, giải quyết vấn đề này 1 28
72_______99 3 11 4 13 25 15 27 sys.getsizeof(5)4 29 19 31 sys.getsizeof(5)8 33 313 35 42 28
1317 28
213 Câu chuyện tương tự đối với các bộ dữ liệu. Chi phí hoạt động của một bộ dữ liệu trống là 40 byte so với. 56 của một danh sách. Một lần nữa, sự khác biệt 16 byte trên mỗi chuỗi này là kết quả thấp nếu bạn có cấu trúc dữ liệu với nhiều chuỗi nhỏ, không thay đổi 1 21 2_______53 3 25 4 23 25 29 27 23 29 31 import sys04 33 sys.getsizeof(5)8 35 import sys08 28
1import sys10 28
2import sys12 28
4import sys10 Các bộ và từ điển có vẻ như không phát triển chút nào khi bạn thêm các mục, nhưng lưu ý rằng chi phí rất lớn Điểm mấu chốt là các đối tượng Python có chi phí cố định rất lớn. Nếu cấu trúc dữ liệu của bạn bao gồm một số lượng lớn các đối tượng bộ sưu tập như chuỗi, danh sách và từ điển chứa một số lượng nhỏ các mục, mỗi đối tượng thì bạn phải trả một khoản phí lớn Hàm |