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

alist = range(1000000) # or list(range(1000000)) in Python 3.0
有帮助吗?

解决方案 2

有用的链接:

如何获取内存大小/使用python对象

python对象的内存大小?

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

然而,他们没有给出确定的答案。要走的路:

  1. 测量带有/不带列表的Python解释器消耗的内存(使用操作系统工具)。

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

  3. <强>更新

    Recipe 546530:Python对象的大小(修订版)

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

其他提示

“这取决于。” Python为列表分配空间,以便实现摊销的固定时间,以便将元素附加到清单。

实际上,这与当前实现的含义是......列表总是为两个幂的元素分配空间。所以range(1000000)实际上会分配一个足够大的列表来容纳2 ^ 20个元素(~10.45亿)。

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

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

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

PS-Tuples与列表不同,未设计以逐渐附加元素。我不知道分配器是如何工作的,但是甚至不考虑将它用于大型数据结构: - )

寻址“元组”问题的一部分

在典型的构建配置中声明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 [] 数组为根的对象图所消耗的总字节数。

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

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

  

一个新函数 getsizeof(),需要一个   Python对象并返回金额   测量对象使用的内存   以字节为单位内置对象返回   正确的结果;第三方   扩展可能不会,但可以定义一个    __ sizeof __()方法返回对象&#8217;的大小。

kveretennicov@nosignal:~/py/r26rc2$ ./python
Python 2.6rc2 (r26rc2:66712, Sep  2 2008, 13:11:55) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
>>> import sys
>>> sys.getsizeof(range(1000000))
4000032
>>> sys.getsizeof(tuple(range(1000000)))
4000024

显然,返回的数字不包含所包含对象占用的内存(sys.getsizeof(1)== 12)。

这是特定于实现的,我很确定。当然它取决于整数的内部表示 - 你不能假设它们将被存储为32位,因为Python会给你任意大的整数,所以也许小的int更紧凑地存储。

在我的Python上(Fedora 9上的2.5.1核心2二重奏),分配前的VmSize是6896kB,之后是22684kB。经过一百万元素分配后,VmSize达到38340kB。对于1000000个整数,这非常粗略地表示大约16000kB,每个整数大约16个字节。这表明列表的开销很多。我会用一小撮盐给这些数字。

我很担心你问的原因。您是否想知道给定实现需要多少内存?说,你将阅读10,000,000个小部件,并想知道它会吸多少RAM?

如果是这种情况,而不是试图弄清楚每个小部件需要多少RAM,那么可以计算出多少RAM,比如10,000个小部件需要多少才能获得实际大小。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top