2012-02-25 41 views
13

Xét đoạn mã sau:Python: kích thước của chuỗi trong bộ nhớ

arr = [] 
for (str, id, flag) in some_data: 
    arr.append((str, id, flag)) 

Hãy tưởng tượng chuỗi đầu vào là 2 ký tự dài trung bình và 5 ký tự tối đa và some_data có 1 triệu yếu tố. Yêu cầu bộ nhớ của cấu trúc như vậy là gì?

Có thể là rất nhiều bộ nhớ bị lãng phí cho các chuỗi? Nếu vậy, làm thế nào tôi có thể tránh điều đó?

Trả lời

20

Trong trường hợp này, vì các chuỗi khá ngắn, và có quá nhiều trong số chúng, bạn đứng để tiết kiệm một chút dung lượng bộ nhớ bằng cách sử dụng intern trên các chuỗi. Giả sử chỉ có chữ thường trong các chuỗi, đó là 26 * 26 = 676 chuỗi có thể, vì vậy phải có nhiều lần lặp lại trong danh sách này; intern sẽ đảm bảo rằng những lần lặp lại đó không dẫn đến các đối tượng duy nhất, nhưng tất cả đều đề cập đến cùng một đối tượng cơ sở.

Có thể Python đã thực hiện chuỗi ngắn; nhưng nhìn vào một số nguồn khác nhau, có vẻ như điều này phụ thuộc rất nhiều vào việc triển khai thực hiện. Vì vậy, gọi số intern trong trường hợp này là có thể là cách để đi; YMMV.

Là một xây dựng trên tại sao điều này là rất có khả năng tiết kiệm bộ nhớ, hãy xem xét những điều sau đây:

>>> sys.getsizeof('') 
40 
>>> sys.getsizeof('a') 
41 
>>> sys.getsizeof('ab') 
42 
>>> sys.getsizeof('abc') 
43 

Thêm nhân vật duy nhất để một chuỗi bổ sung thêm chỉ một byte với kích thước của chuỗi chính nó, nhưng mỗi chuỗi chiếm 40 byte riêng của nó.

+0

Bây giờ tôi đã học được rằng trăn nói chung là khá tốn bộ nhớ. Như bạn đã chỉ ra một cách chính xác, độ dài của các chuỗi không phải là vấn đề ở đây, mà là kích thước tối thiểu của các đối tượng. Tôi hơi sốc khi phát hiện ra rằng kích thước của một int đơn giản là 24 byte (trên hệ thống 64 bit). Điều cần biết ... –

0

Nếu chuỗi của bạn quá ngắn, có khả năng sẽ có một số lượng đáng kể các bản sao. Việc thực thi Python sẽ tối ưu hóa nó để các chuỗi này chỉ được lưu trữ một lần và tham chiếu sử dụng nhiều tiem, thay vì lưu trữ chuỗi nhiều lần ...

Các chuỗi này phải được tự động thực hiện như có.

+0

Chuỗi ký tự được tập trung, nhưng các chuỗi được tạo từ các nguồn khác không nhất thiết bị xen kẽ. Bạn sẽ không muốn một cuộc gọi 'intern' mỗi khi bạn đọc một cái gì đó từ một tập tin ... – delnan

Các vấn đề liên quan