2009-11-05 49 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