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

标签 python performance list memory

我有一个 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

关于python - 80000 个项目的列表在 python 中大约消耗多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14447333/

相关文章:

python - 在任何网络连接上启动脚本

performance - 带有 JBoss 'minimal' 配置的 Seam 应用程序?

list - 对象以 "s"结尾时的命名约定列表

python - 如何从python中的字符串中删除小写单词

Python 字符串、列表和元组的行为不同

python - 索引错误 : list index out of range python 3. 6

python - 在 Python 的多进程中硬杀死挂起的子进程

python - 将列表中的每个第 N 个元素乘以 M

performance - GitLab CI 加速

java - 如何缩短 Android Studio 3.0 的构建时间?