Python结构的内存大小

是否有关于32位和64位平台上Python数据结构的内存大小的参考?

如果没有,这将是很好的拥有它。 越穷越好! 那么下面的Python结构会使用多less个字节(具体取决于len和相关的内容types)?

  • int
  • float
  • 参考
  • str
  • unicodestring
  • tuple
  • list
  • dict
  • set
  • array.array
  • numpy.array
  • deque
  • 新式的类对象
  • 旧式的类对象
  • …而我忘记的一切!

(对于仅保留对其他对象的引用的容器,我们显然不希望自己计算该项的大小,因为它可能是共享的。)

而且,有没有办法在运行时获取对象使用的内存(recursion或不)?

先前的问题的build议是使用sys.getsizeof() ,引用:

 >>> import sys >>> x = 2 >>> sys.getsizeof(x) 14 >>> sys.getsizeof(sys.getsizeof) 32 >>> sys.getsizeof('this') 38 >>> sys.getsizeof('this also') 48 

你可以采取这种方法:

 >>> import sys >>> import decimal >>> >>> d = { ... "int": 0, ... "float": 0.0, ... "dict": dict(), ... "set": set(), ... "tuple": tuple(), ... "list": list(), ... "str": "a", ... "unicode": u"a", ... "decimal": decimal.Decimal(0), ... "object": object(), ... } >>> for k, v in sorted(d.iteritems()): ... print k, sys.getsizeof(v) ... decimal 40 dict 140 float 16 int 12 list 36 object 8 set 116 str 25 tuple 28 unicode 28 

2012-09-30

python2.7(Linux,32位):

 decimal 36 dict 136 float 16 int 12 list 32 object 8 set 112 str 22 tuple 24 unicode 32 

python3.3(Linux,32位)

 decimal 52 dict 144 float 16 int 14 list 32 object 8 set 112 str 26 tuple 24 unicode 26 

2016年8月1日

OSX,Python 2.7.10(默认,2015年10月23日,19:19:21)达尔文[GCC 4.2.1兼容苹果LLVM 7.0.0(clang-700.0.59.5)]

 decimal 80 dict 280 float 24 int 24 list 72 object 16 set 232 str 38 tuple 56 unicode 52 

我一直很高兴地使用pympler这样的任务。 它与许多Python版本兼容 – asizeof模块尤其可以追溯到2.2!

例如,使用hughdbrown的例子,但在开始时使用from pympler import asizeof ,最后print asizeof.asizeof(v) ,我看到(MacOSX 10.5上的系统Python 2.5):

 $ python pymp.py set 120 unicode 32 tuple 32 int 16 decimal 152 float 16 list 40 object 0 dict 144 str 32 

显然这里有一些近似,但我发现它非常有用的足迹分析和调整。

你也可以使用古比模块。

 >>> from guppy import hpy; hp=hpy() >>> hp.heap() Partition of a set of 25853 objects. Total size = 3320992 bytes. Index Count % Size % Cumulative % Kind (class / dict of class) 0 11731 45 929072 28 929072 28 str 1 5832 23 469760 14 1398832 42 tuple 2 324 1 277728 8 1676560 50 dict (no owner) 3 70 0 216976 7 1893536 57 dict of module 4 199 1 210856 6 2104392 63 dict of type 5 1627 6 208256 6 2312648 70 types.CodeType 6 1592 6 191040 6 2503688 75 function 7 199 1 177008 5 2680696 81 type 8 124 0 135328 4 2816024 85 dict of class 9 1045 4 83600 3 2899624 87 __builtin__.wrapper_descriptor <90 more rows. Type eg '_.more' to view.> 

和:

 >>> hp.iso(1, [1], "1", (1,), {1:1}, None) Partition of a set of 6 objects. Total size = 560 bytes. Index Count % Size % Cumulative % Kind (class / dict of class) 0 1 17 280 50 280 50 dict (no owner) 1 1 17 136 24 416 74 list 2 1 17 64 11 480 86 tuple 3 1 17 40 7 520 93 str 4 1 17 24 4 544 97 int 5 1 17 16 3 560 100 types.NoneType 

这些答案都收集浅层信息。 我怀疑这个问题的访问者最终会回答这个问题:“这个复杂的对象在记忆中有多大?

这里有一个很好的答案: https : //goshippo.com/blog/measure-real-size-any-python-object/

妙语:

 import sys def get_size(obj, seen=None): """Recursively finds size of objects""" size = sys.getsizeof(obj) if seen is None: seen = set() obj_id = id(obj) if obj_id in seen: return 0 # Important mark as seen *before* entering recursion to gracefully handle # self-referential objects seen.add(obj_id) if isinstance(obj, dict): size += sum([get_size(v, seen) for v in obj.values()]) size += sum([get_size(k, seen) for k in obj.keys()]) elif hasattr(obj, '__dict__'): size += get_size(obj.__dict__, seen) elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)): size += sum([get_size(i, seen) for i in obj]) return size 

像这样使用:

 In [1]: get_size(1) Out[1]: 24 In [2]: get_size([1]) Out[2]: 104 In [3]: get_size([[1]]) Out[3]: 184 

如果你想更深入地了解Python的内存模型,这里有一篇很棒的文章,里面有一个类似“总大小”的代码片断,作为更长的解释的一部分: https : //code.tutsplus.com/tutorials/understand-how-多less记忆,你的Python对象使用- CMS-25609

尝试内存分析器。 内存分析器

 Line # Mem usage Increment Line Contents ============================================== 3 @profile 4 5.97 MB 0.00 MB def my_func(): 5 13.61 MB 7.64 MB a = [1] * (10 ** 6) 6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7) 7 13.61 MB -152.59 MB del b 8 13.61 MB 0.00 MB return a 

当你使用dir([object])内build函数时,你可以使用sizeof内build函数。

 >>> a = -1 >>> a.__sizeof__() 24