关于性能:了解Python中的对象使用了多少内存

关于性能:了解Python中的对象使用了多少内存

Find out how much memory is being used by an object in Python

本问题已经有最佳答案,请猛点这里访问。

你将如何找出一个对象使用了多少内存?我知道有可能知道一块代码使用了多少,但不知道一个实例化对象(在其生命周期中的任何时候)使用了多少,这正是我想要的。


要找出一个python对象的内存大小是不容易的。您可能会发现的一个问题是,python对象(如list和dict)可能引用了其他的python对象(在本例中,您的大小是多少)?是否包含每个对象的大小?)。存在一些与对象类型和垃圾收集相关的指针开销和内部结构。最后,一些Python对象具有不明显的行为。例如,在大多数情况下,列表为更多对象预留空间;dict甚至更复杂,因为它们可以以不同的方式操作(它们对少量键有不同的实现,有时它们会过度分配条目)。

这里有一大块代码(以及一大块更新后的代码),以尽量接近内存中Python对象的大小。

您可能还需要检查关于pyobject(实际上表示所有python对象的内部C结构)的一些旧描述。


试试这个:

1
sys.getsizeof(object)

getsizeof()调用对象的__sizeof__方法,如果对象由垃圾收集器管理,则会添加额外的垃圾收集器开销。

递归配方


另一种方法是使用泡菜。请参阅此问题副本的答案。


我对以下任何一项都没有任何个人经验,但只需简单搜索"python[内存]分析器"即可:

  • pysizer,"一个针对python的内存分析器",可以在http://pysizer.8325.org/上找到。然而,页面似乎表明该项目已经有一段时间没有更新了,并且引用了…

  • heapy,"支持在python程序中调试和优化内存相关问题",可在http://guppy pe.sourceforge.net/heapy找到。

希望有帮助。


必须小心使用,因为对象的覆盖可能会误导用户。

使用bregman.suite,一些使用sys.getsizeof的测试将对象实例中数组对象(数据)的副本输出为大于对象本身(mfcc)。

1
2
3
4
5
6
7
8
9
10
>>> mfcc = MelFrequencyCepstrum(filepath, params)
>>> data = mfcc.X[:]
>>> sys.getsizeof(mfcc)
64
>>> sys.getsizeof(mfcc.X)
>>>80
>>> sys.getsizeof(data)
80
>>> mfcc
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90>

对于大的物体,你可以使用一些粗糙但有效的方法:检查您的python进程在系统中占用了多少内存,然后删除该对象并进行比较。

这个方法有很多缺点,但它会给你一个非常大的物体非常快速的估计。


推荐阅读

    提高3A四核羿龙II游戏配置的性能

    提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

    优化PostgreSQL中的批量更新性能

    优化PostgreSQL中的批量更新性能,数据,表格,在Ubuntu 12.04上使用PG 9.1. 我们目前需要24小时才能运行大量UPDATE数据库上的语句,其形式

    诺基亚威图性能好到哪里

    诺基亚威图性能好到哪里,诺基亚,手机,诺基亚威图性能好到哪里这是一部以前列出的手机。即使当时配置不高,该品牌的手机也不依赖于该功能吸

    魅蓝note6性能参数有哪些

    魅蓝note6性能参数有哪些,摄像头,蓝牙,魅蓝note6性能参数有哪些魅力蓝色Note6最好拍照。电池寿命更长。蓝色Note6使用高通 snapdragon 625

    内存插槽坏了 怎么办

    内存插槽坏了 怎么办,插槽,内存,电脑,一个插槽能用,就不要修了,修主板成本高,不划算,而且返修过的东东,一不小心,说不定其它某个地方就坏了,主板

    512内存的电脑优化|笔记本内存512

    512内存的电脑优化|笔记本内存512,,1. 笔记本内存512够用,因为运行非常流畅,苹果笔记本 16g512的运行内存是16g内存,机身内存是512g内存,运行