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