2012-02-25 15 views
13

串的大小考慮下面的代碼:的Python:在存儲器

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

想象輸入串爲2個字符長的平均和最大5個字符和some_data具有1個百萬個元素。 這種結構的內存要求是什麼?

但願這是一個很大的浪費內存爲字符串?如果是這樣,我該如何避免?

回答

20

在這種情況下,由於字符串非常短,並且有很多這樣的字符串,所以通過在字符串上使用intern可以節省一定的內存。假設字符串中只有小寫字母,那就是26 * 26 = 676個可能的字符串,所以在這個列表中必須有很多重複; intern將確保那些重複不會導致唯一的對象,但都指向相同的基礎對象。

這有可能是Python的已經實習生短串;但是看一些不同的來源,看起來這是高度依賴於實施的。所以在這種情況下撥打intern大概是的路要走;因人而異。

至於爲什麼這極有可能是爲了節省內存的詳細闡述,考慮以下因素:

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

添加單個字符的字符串將只有一個字節字符串本身的大小,但字符串本身佔用40個字節。

+0

現在我才知道,蟒蛇一般是比較消耗內存。正如您正確指出的那樣,字符串的長度不是問題,而是對象的最小尺寸。我有點震驚地發現一個簡單的int的大小是24字節(在64位系統上)。有用的信息... – 2012-02-25 16:33:30

0

如果你的字符串是如此短暫,很可能會出現重複的顯著數量。 Python的實習將優化它,使這些字符串存儲只有一次,參考使用多個TIEMS,而不是多次存儲串...

這些字符串應該自動扣留,因爲有。

+0

字符串文字是實習的,但是從其他來源創建的字符串不一定是相互關聯的。每次從文件中讀取某些內容時,您都不會希望進行「實習」呼叫... – delnan 2012-02-25 17:49:58