python - 列表对象作为数组对象的参数值是否占用 Python 中的内存?
问题描述
array.array
对象的内存占用比list
Python 中的对象小。当您创建以下类似内容时,它是否仍然有效array.array
?
from array import array
array('l', [1, 2, 3, 4, 5])
我们仍然在那里创建一个列表对象(作为参数值)来创建该数组。这不是使数组不值得使用吗?
更新:看起来我应该重新考虑数组占用的空间比列表少的说法。似乎它们的行为在不同的 Python 版本中有所不同:
Python 3.5.2
>>> import array, sys
>>> mylist = [1, 2, 3]
>>> myarray = array.array('i', [1, 2, 3])
>>> sys.getsizeof(mylist)
44
>>> sys.getsizeof(myarray)
44
Python 3.6.3
>>> import array, sys
>>> mylist = [1, 2, 3]
>>> myarray = array.array('i', [1, 2, 3])
>>> sys.getsizeof(mylist)
88
>>> sys.getsizeof(myarray)
76
但是,我原来的问题仍然存在(对于 Python 3.6)。myarray
使用要构建的列表。如何使用数组更节省内存?
解决方案
sys.getsizeof
不是递归的。所以它会告诉你,列表占用了多少内存。但不是列表的内容。尝试这个:
mylist = [ 5000, 5001, 5002 ]
sys.getsizeof(mylist) + sum(sys.getsizeof(q) for q in mylist)
输出172
。
array.array
肯定是使用更少的内存,它也更密集,所以它对缓存更友好。
在您的示例中,列表也用于创建array.array
然后立即销毁。所以这里没有什么大问题。
推荐阅读
- python - 在 `pipenv install` 之后使用 `pipenv shell` 会产生“已激活 UNKNOWN_VIRTUAL_ENVIRONMENT 的外壳”。
- jquery - Ajax 按类别过滤帖子
- css - 如何在窗口调整大小时更改弹性顺序?
- javascript - 来自 CosmosDB JavaScript 的 Azure 函数更改源
- django - Django 2.2.4 无法提供我的静态文件
- javascript - React+ Redux 的外部插件架构
- c++ - C++ 未解析的外部符号
- typescript - 属性的实例类型是实例本身的构造函数,打字稿
- powershell - 为所有用户提供在 Active Directory 中编辑他们自己的特定属性的能力
- rxjs - 假设所有嵌套的 RxJS 订阅都可以被 mergeMap 替换是否安全?