2009-11-05 46 views
8

我需要一個非常大的列表,並且試圖弄清楚我可以做到多大,以便它仍然適合1-2GB的RAM。我在64位(x86_64)上使用CPython實現。Python:列表的每個元素需要多少空間?

編輯:感謝bua的回答,我已經填寫了一些更具體的答案。

什麼是(以字節爲單位)的空間(內存)用法:

  • 列表本身
    • sys.getsizeof([]) == 72
  • 各列表項(不包括數據)
    • sys.getsizeof([0, 1, 2, 3]) == 104,所以8字節以上每個項目的頭。
  • 數據,如果它是一個整數
    • sys.getsizeof(2**62) == 24(而是變化的根據整數大小)
    • sys.getsizeof(2**63) == 40
    • sys.getsizeof(2**128) == 48
    • sys.getsizeof(2**256) == 66
  • 數據,如果它是一個對象(我猜想是sizeof(Pyobject)) )
    • sys.getsizeof(C()) == 72(C是一個空的用戶空間物體)

如果可以共享有關所觀察到的大小,這將是巨大更一般的數據。例如:

  • 是否有特殊情況(我認爲不可變的值可能是共享的,所以也許一個bools列表不會爲數據佔用額外的空間)?
  • 也許小的列表需要X字節的開銷,但大的列表需要Y字節的開銷?
+0

你可能想用你添加的信息來回答你自己的問題,但是很明顯bua已經回答了你問題的主要部分,而EOL提供了一種更準確的預測方式和更多的內容到RAM中。 – 2009-11-05 14:32:33

+0

這是發佈爲必須作爲鏈接唯一答案刪除的答案,但它似乎可能有用,所以我將其作爲評論發佈。本週的Python模塊做了一篇關於Python內存管理的文章,您可以在這裏查看:http://pymotw.com/2/sys/limits.html – ArtOfWarfare 2014-11-02 13:15:11

回答

9

點開始:

>>> import sys 
>>> a=list() 
>>> type(a) 
<type 'list'> 
>>> sys.getsizeof(a) 
36 
>>> b=1 
>>> type(b) 
<type 'int'> 
>>> sys.getsizeof(b) 
12 

和蟒蛇幫助:

>>> help(sys.getsizeof) 
Help on built-in function getsizeof in module sys: 

getsizeof(...) 
    getsizeof(object, default) -> int 

    Return the size of object in bytes. 
6

如果你想數值的清單,在標準array模塊提供優化的陣列(有追加方法)。

非標準但常用的NumPy模塊爲您提供固定大小的高效數組。

+1

+1,對於數組模塊 – 2009-11-05 13:53:49