如何在Python中获得对象在内存中占用的大小?
当前回答
这可能比看起来要复杂得多,这取决于你想要如何计数。例如,如果您有一个int类型的列表,您是否需要包含对int类型引用的列表的大小?(即-列表,而不是包含在其中的内容),或者你想包括实际指向的数据,在这种情况下,你需要处理重复引用,以及如何防止重复计数当两个对象包含对同一对象的引用时。
您可能想要查看python内存分析器之一,例如pysizer,以查看它们是否满足您的需求。
其他回答
Pympler包的asizeof模块可以做到这一点。
使用方法如下:
from pympler import asizeof
asizeof.asizeof(my_object)
不像系统。Getsizeof,它适用于你自己创建的对象。它甚至可以与numpy一起工作。
>>> asizeof.asizeof(tuple('bcd'))
200
>>> asizeof.asizeof({'foo': 'bar', 'baz': 'bar'})
400
>>> asizeof.asizeof({})
280
>>> asizeof.asizeof({'foo':'bar'})
360
>>> asizeof.asizeof('foo')
40
>>> asizeof.asizeof(Bar())
352
>>> asizeof.asizeof(Bar().__dict__)
280
>>> A = rand(10)
>>> B = rand(10000)
>>> asizeof.asizeof(A)
176
>>> asizeof.asizeof(B)
80096
正如前面提到的,
可以通过设置option code=True来包含类、函数、方法、模块等对象的(字节)代码大小。
如果你需要实时数据的其他视图,请选择Pympler
模块muppy用于在线监控Python应用程序 和模块类跟踪器提供的生命周期的离线分析 选择Python对象。
对于numpy数组,getsizeof不起作用-对我来说,它总是出于某种原因返回40:
from pylab import *
from sys import getsizeof
A = rand(10)
B = rand(10000)
然后(在ipython中):
In [64]: getsizeof(A)
Out[64]: 40
In [65]: getsizeof(B)
Out[65]: 40
不过令人高兴的是,:
In [66]: A.nbytes
Out[66]: 80
In [67]: B.nbytes
Out[67]: 80000
如果性能不是问题,最简单的解决方案是pickle和测量:
import pickle
data = ...
len(pickle.dumps(data))
你可以序列化对象,以获得与对象大小密切相关的度量值:
import pickle
## let o be the object whose size you want to measure
size_estimate = len(pickle.dumps(o))
如果您想测量无法pickle的对象(例如,由于lambda表达式),dill或cloudpickle可以是一种解决方案。
这可能不是最相关的答案,但我只对对象存储和检索感兴趣。因此将对象转储为pickle并检查pickle的大小就足够了
推荐文章
- 把if-elif-else语句放在一行中?
- 我如何结合两个数据框架?
- 如何计数列表中唯一值的出现
- 在JSON键名中哪些字符是有效的/无效的?
- 为什么Pycharm的检查人员抱怨“d ={}”?
- 如何JSON序列化集?
- 大概的成本访问各种缓存和主存储器?
- 高速缓存线是如何工作的?
- 在python中,年龄从出生日期开始
- 使用pip安装SciPy
- 在Python中,我应该如何测试变量是否为None, True或False
- 如何在Python中从毫秒创建datetime ?
- 如何解窝(爆炸)在一个熊猫数据帧列,成多行
- 如何使用pip安装opencv ?
- 在pip冻结命令的输出中“pkg-resources==0.0.0”是什么