Skip to main content
 首页 » 编程设计

python之80000 个项目的列表在 python 中大约消耗多少内存

2025年05月04日13jyk

我有一个 python 列表,它由 80000 个列表组成。这些内部列表中的每一个或多或少都具有以下格式:

["012345", "MYNAME" "Mon", "A", 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20] 

你能说出这个由 80000 个列表组成的列表大约会消耗多少内存吗?

在 python 中使用和操作这么大的列表是否常见/可以?我所做的大部分操作是使用列表理解方法从该列表中提取数据。

实际上,我想学习的是:python 是否足够快,可以使用列表理解方法从大列表中提取数据。我希望我的脚本速度快

请您参考如下方法:

In [39]: lis=["012345", "MYNAME" "Mon", "A", 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 
     20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20] 
 
In [40]: k=[lis[:] for _ in xrange(80000)] 
 
In [41]: k.__sizeof__() 
Out[41]: 325664 
 
In [42]: sys.getsizeof(k)  #after gc_head 
Out[42]: 325676 

根据 sysmodule.c 中的代码看起来它调用了 __sizeof__ 方法来获取对象的大小。

   837   method = _PyObject_LookupSpecial(o, &PyId___sizeof__);    
   838     if (method == NULL) { 
   839         if (!PyErr_Occurred()) 
   840             PyErr_Format(PyExc_TypeError, 
   841                          "Type %.100s doesn't define __sizeof__", 
   842                          Py_TYPE(o)->tp_name); 
   843     } 
   844     else { 
   845         res = PyObject_CallFunctionObjArgs(method, NULL); 
   846         Py_DECREF(method); 
   847     } 

然后为其添加一些gc开销:

   860     /* add gc_head size */ 
   861     if (PyObject_IS_GC(o)) { 
   862         PyObject *tmp = res; 
   863         res = PyNumber_Add(tmp, gc_head_size); 
   864         Py_DECREF(tmp); 
   865     } 
   866     return res; 
   867 } 

我们还可以使用 recursive sizeof recipe正如 docs 中所建议的那样递归计算每个容器的大小:

In [17]: total_size(k)  #from recursive sizeof recipe 
Out[17]: 13125767 
 
In [18]: sum(y.__sizeof__() for x in k for y in x) 
Out[18]: 34160000