Python列表(元组)中每个元素有多少个字节?

例如,需要多少内存来存储一百万(32位)整数列表?

alist = range(1000000) # or list(range(1000000)) in Python 3.0

“这取决于。” Python以这种方式为列表分配空间,以实现将元素附加到列表的分摊恒定时间。

实际上,这对于当前实现意味着什么......该列表总是具有分配给两个幂数的元素的空间。 所以范围(1000000)实际上会分配一个足够容纳2 ^ 20个元素(〜104.5万)的列表。

这只是存储列表结构本身所需的空间(这是指向每个元素的Python对象的指针数组)。 一个32位系统将需要每个元素4个字节,一个64位系统将使用每个元素8个字节。

此外,您需要空间来存储实际元素。 这种差异很大。 对于小整数(当前为-5到256),不需要额外的空间,但对于更大的数字,Python会为每个整数分配一个新对象,这需要10-100个字节,并倾向于分割内存。

底线:这很复杂,Python列表不是存储大量同类数据结构的好方法。 为此,请使用array模块,或者,如果您需要执行矢量化数学运算,请使用NumPy。

与列表不同,PS元组没有被设计为具有逐步添加到它们的元素。 我不知道分配器是如何工作的,但是甚至不考虑将它用于大型数据结构:-)


有用的链接:

如何获得python对象的内存大小/使用情况

python对象的内存大小?

如果您将数据放入字典中,我们如何计算数据大小?

但是他们没有给出明确的答案。 走的路:

  • 测量Python解释器使用/不使用列表所使用的内存(使用操作系统工具)。

  • 使用定义某种sizeof(PyObject)的第三方扩展模块。

  • 更新

    食谱546530:Python对象的大小(修改)

    import asizeof
    
    N = 1000000
    print asizeof.asizeof(range(N)) / N
    # -> 20 (python 2.5, WinXP, 32-bit Linux)
    # -> 33 (64-bit Linux)
    

    解决问题的“元组”部分

    在典型的构建配置中,CPython的PyTuple声明归结为:

    struct PyTuple {
      size_t refcount; // tuple's reference count
      typeobject *type; // tuple type object
      size_t n_items; // number of items in tuple
      PyObject *items[1]; // contains space for n_items elements
    };
    

    PyTuple实例的大小在构建过程中是固定的,之后不能更改。 PyTuple占用的字节数可以计算为

    sizeof(size_t) x 2 + sizeof(void*) x (n_items + 1)

    这给出了元组的浅层大小。 要获得完整大小,还需要添加根源于PyTuple::items[]数组的对象图消耗的总字节数。

    值得注意的是,元组构造例程确保只创建空元组的单个实例(singleton)。

    参考文献:Python.h,object.h,tupleobject.h,tupleobject.c

    链接地址: http://www.djcxy.com/p/53573.html

    上一篇: How many bytes per element are there in a Python list (tuple)?

    下一篇: Convert flat list to dictionary with keys at regular intervals