Python结构的内存大小问题如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (209)

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

如果没有,这将是很好的拥有它。越详尽越好!那么以下Python结构会使用多少个字节(取决于len相关时的内容类型)?

  • int
  • float
  • 参考
  • str
  • unicode字符串
  • tuple
  • list
  • dict
  • set
  • array.array
  • numpy.array
  • deque
  • 新式类对象
  • 旧式类对象
  • ...和我忘记的一切!

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

此外,有没有办法在运行时获得对象使用的内存(递归或不)?

提问于
用户回答回答于

使用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

python 2.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

OSX,Python 2.7.10(默认,2015年10月23日,19:19:21)[GCC 4.2.1 Compatible Apple 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

我发现它对于内存占用分析和调优非常有用。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动