Python:列表中每个元素占用多少空间?

9 投票
2 回答
5088 浏览
提问于 2025-04-15 15:41

我需要一个非常大的列表,正在尝试弄清楚我能做多大,以便它仍然能适应1-2GB的内存。我使用的是CPython的实现,运行在64位系统上(x86_64)。

编辑:感谢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是一个空的用户自定义对象)

如果你能分享一些关于观察到的大小的更一般的数据,那就太好了。例如:

  • 有没有特殊情况(我觉得不可变值可能会共享,所以布尔值的列表可能不会占用额外的空间)?
  • 也许小列表的开销是X字节,但大列表的开销是Y字节?

2 个回答

7

如果你需要一堆数字,Python里有一个标准的数组模块,它提供了优化过的数组(这个数组有添加元素的方法)。

还有一个不算标准,但大家常用的NumPy模块,它能让你创建固定大小的高效数组。

12

开始的地方:

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

还有来自Python帮助文档的内容:

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

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

    Return the size of object in bytes.

撰写回答