Hướng dẫn how much memory is a python dictionary? - bao nhiêu bộ nhớ là một từ điển python?

Ngày 12 tháng 5 năm 2019. Bởi reuven. By Reuven

Hãy nói rằng chúng tôi tạo ra một từ điển Python mới, trống rỗng:

>>> d = {}

Bao nhiêu bộ nhớ này mà Dict Dictume mới tiêu thụ? Chúng ta có thể tìm hiểu với các sys.getsizeof

>>> import sys
>>> sys.getsizeof(d)
240

Nói cách khác, từ điển của chúng tôi, không có gì trong đó, tiêu thụ 240 byte. Không tệ; Với tần suất từ ​​điển được sử dụng trong Python, thật tốt khi biết rằng họ không thường tiêu thụ nhiều bộ nhớ đó.

Điều gì sẽ xảy ra nếu tôi thêm một cái gì đó vào dict? Điều gì sẽ xảy ra với việc sử dụng bộ nhớ?

>>> d['a'] = 1
>>> sys.getsizeof(d)
240

Một cái gì đó có vẻ hơi tanh ở đây, phải không? Làm thế nào có thể là từ điển mới được tạo của chúng tôi, với các cặp giá trị khóa bằng không, chiếm cùng một không gian trong bộ nhớ với từ điển của chúng tôi với một cặp giá trị khóa?

Câu trả lời là của Sys Sys.GetsizeOf, đang trả về kích thước của từ điển dưới dạng cấu trúc dữ liệu, chứ không phải dữ liệu bên trong nó. Nói cách khác: Khi chúng ta lần đầu tiên tạo một từ điển, nó chứa tám vị trí có thể chứa đầy các cặp giá trị khóa. Chỉ khi từ điển cần phát triển, bởi vì nó có quá nhiều cặp giá trị khóa cho kích thước hiện tại của nó, nó mới phân bổ nhiều bộ nhớ hơn.

Hơn nữa, các cặp giá trị chính tự nó được lưu trữ trong chính dict. Thay vào đó, chỉ là một tham chiếu đến nơi trong bộ nhớ chứa các phím và giá trị được lưu trữ ở đó. Vì vậy, cả loại và kích thước của dữ liệu đều không được giữ trong từ điển, và nó chắc chắn không ảnh hưởng đến kết quả của Sys sys.getsizeofof cho từ điển. Thật vậy, hãy xem cái này:

>>> d['a'] = 'a' * 100000
>>> sys.getsizeof(d)
240

Ngay cả khi giá trị dài 100.000 ký tự, từ điển của chúng tôi chỉ cần 240 byte.

Điều gì xảy ra khi chúng ta mở rộng từ điển? Khi nào nó yêu cầu thêm bộ nhớ? Hãy để một cái nhìn:

>>> d = {}
>>> for one_letter in 'abcdefghijklmnopqrstuvwxyz':
d[one_letter] = one_letter
print(f'{len(d)}, sys.getsizeof(d) = {sys.getsizeof(d)}')

1, sys.getsizeof(d) = 240
2, sys.getsizeof(d) = 240
3, sys.getsizeof(d) = 240
4, sys.getsizeof(d) = 240
5, sys.getsizeof(d) = 240
6, sys.getsizeof(d) = 368
7, sys.getsizeof(d) = 368
8, sys.getsizeof(d) = 368
9, sys.getsizeof(d) = 368
10, sys.getsizeof(d) = 368
11, sys.getsizeof(d) = 648
12, sys.getsizeof(d) = 648
13, sys.getsizeof(d) = 648
14, sys.getsizeof(d) = 648
15, sys.getsizeof(d) = 648
16, sys.getsizeof(d) = 648
17, sys.getsizeof(d) = 648
18, sys.getsizeof(d) = 648
19, sys.getsizeof(d) = 648
20, sys.getsizeof(d) = 648
21, sys.getsizeof(d) = 648
22, sys.getsizeof(d) = 1184
23, sys.getsizeof(d) = 1184
24, sys.getsizeof(d) = 1184
25, sys.getsizeof(d) = 1184
26, sys.getsizeof(d) = 1184

Như bạn có thể thấy, từ điển thêm nhiều cặp giá trị khóa, nó cần nhiều bộ nhớ hơn. Nhưng nó không phát triển với mỗi bổ sung; Mỗi lần nó cần nhiều không gian hơn, nó phân bổ nhiều hơn mức cần thiết, để phân bổ có thể tương đối hiếm.

Điều gì xảy ra nếu chúng ta loại bỏ các mục khỏi từ điển của chúng ta? Nó sẽ trả lại bộ nhớ cho hệ thống? Hãy cùng tìm hiểu:

>>> for key in list(d.keys()):
d.pop(key)

>>> len(d)

0

Lưu ý rằng trong mã trên, tôi đã không lặp đi lặp lại trên các trò chơi D D hoặc D.Keys. Làm như vậy sẽ dẫn đến một lỗi, bởi vì thay đổi từ điển trong khi lặp lại nó là một vấn đề. Do đó, tôi đã tạo một danh sách dựa trên các khóa và lặp lại điều đó.

Bạn cũng có thể thấy rằng sau khi loại bỏ các cặp giá trị tên này khỏi dict của tôi, nó thực sự trống rỗng. Và việc sử dụng bộ nhớ của nó?

>>> sys.getsizeof(d)
1184

Nói cách khác: Mặc dù chúng tôi đã loại bỏ các mục khỏi Dict của chúng tôi, nhưng nó đã phát hành bộ nhớ mà trước đây nó đã phân bổ. Tất nhiên, vì điều hiếm khi tôi thấy mình loại bỏ các vật phẩm khỏi Dicts trong mã Python thực tế, tôi không ngạc nhiên khi điều này xảy ra. Rốt cuộc, tại sao lại trả lại bộ nhớ cho hệ thống nếu bạn không có khả năng cần phải làm điều đó? Nhưng điều đó có nghĩa là nếu bạn thực hiện phân bổ hàng tấn bộ nhớ cho một dict, thì bạn không có khả năng lấy lại cho đến khi chương trình kết thúc, ngay cả khi bạn xóa các mục.

Nhưng chờ đã: Điều gì sẽ xảy ra nếu tôi loại bỏ mọi thứ khỏi dict? Có một phương pháp, Dict Dict.clear, đó là điều này. Tôi không thường xuyên sử dụng nó, nhưng ít nhất nó có thể cung cấp cho chúng tôi một số dữ liệu hữu ích:

>>> d.clear()
>>> len(d)
0
>>> sys.getsizeof(d)
72

Đợi một giây ở đây: Sau khi chạy Dict Dict.clear, kích thước dict của chúng tôi thực sự là 0. Đó là những gì nó trước đây. Nhưng chúng tôi bằng cách nào đó sử dụng ít bộ nhớ hơn chúng tôi thậm chí đã làm khi bắt đầu, khi chúng tôi tạo ra một dict trống! Làm thế nào mà có thể được?

Có vẻ như khi bạn chạy Dict Dict.clear, nó sẽ loại bỏ không chỉ tất cả các cặp giá trị khóa, mà còn phân bổ bộ nhớ ban đầu được thực hiện cho các từ điển mới, trống. Có nghĩa là bây giờ chúng ta có một máy bay trống hơn so với từ điển mới, chiếm 72 byte trong hệ thống của chúng ta.

Nếu chúng ta thêm một cặp giá trị khóa mới vào dict

>>> d['a'] = 1
>>> len(d)
0
>>> sys.getsizeof(d)
240

Chắc chắn, thêm rằng một cặp giá trị khóa vào từ D D đã buộc từ điển phân bổ cùng một lượng bộ nhớ mà nó có trước đó, trở lại khi chúng tôi lần đầu tiên tạo nó.

Từ điển có bao nhiêu bộ nhớ trong Python?

Nói cách khác, từ điển của chúng tôi, không có gì trong đó, tiêu thụ 240 byte.Không tệ;Với tần suất từ điển được sử dụng trong Python, thật tốt khi biết rằng chúng thường không tiêu thụ nhiều bộ nhớ đó.240 bytes. Not bad; given how often dictionaries are used in Python, it's good to know that they don't normally consume that much memory.

Làm thế nào lớn là một python từ điển?

Theo mặc định, kích thước nhỏ nhất của từ điển hoặc bộ là 8 (nghĩa là, nếu bạn chỉ lưu trữ ba giá trị, Python vẫn sẽ phân bổ tám yếu tố).Khi thay đổi kích thước, số lượng thùng tăng 4 lần cho đến khi chúng tôi đạt 50.000 yếu tố, sau đó kích thước tăng thêm 2 lần.the smallest size of a dictionary or set is 8 (that is, if you are only storing three values, Python will still allocate eight elements). On resize, the number of buckets increases by 4x until we reach 50,000 elements, after which the size is increased by 2x.

Từ điển sử dụng bao nhiêu bộ nhớ?

Điều đó có nghĩa là bạn cần khoảng 1 MB bộ nhớ để lưu trữ toàn bộ từ điển.Tất nhiên bạn có thể xì hơi nó (zip) và lưu trữ trong bộ nhớ, với tỷ lệ nén khoảng 90%.Điều đó có nghĩa là 100 kb.1 MB of memory to store the entire dictionary. Of course you can deflate it (zip) and store in memory, with a compression rate of about 90%. That means 100 KB.

Từ điển có phải là bộ nhớ Python hiệu quả?

Từ điển Python rất nhanh nhưng mức tiêu thụ bộ nhớ của chúng cũng có thể cao cùng một lúc.their memory consumption can also be high at the same time.