Python中相当于PHP的memory_get_usage()的函数是什么?

24 投票
6 回答
9631 浏览
提问于 2025-04-15 11:46

我之前已经找到过一个相关的问题,在这里,但我想知道有没有更简单粗暴的方法来估算一下我的Python脚本当前使用了多少内存,而且不需要依赖外部库。

我之前用PHP的时候,经常使用memory_get_usage()memory_get_peak_usage()来做这个事情,所以我希望能找到类似的功能。

6 个回答

11

接受的答案是这样说的,但其实用psutil可能更简单(而且更容易移植)。它能做同样的事情,还能做更多的事。

更新:muppy也非常方便(而且比guppy/heapy的文档要好得多)。

18

你也可以使用标准库模块中的 getrusage() 函数。这个函数返回的对象有一个属性叫 ru_maxrss,它可以告诉你调用这个函数的程序的最大内存使用量。

>>> import resource
>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
2656

关于这个属性的单位,Python 文档 说得不是很清楚,但在 Mac OS X 的手册 中提到,这个单位是以千字节为单位的。

至于 Linux 的手册也没有说得很明白,但看起来它和 /proc/self/status 里的信息是相同的(也就是千字节)。如果在 Linux 上运行上面提到的同一个程序,接受的答案中列出的函数会返回:

>>> memory_usage()                                    
{'peak': 6392, 'rss': 2656}

虽然这个方法可能没有 /proc/self/status 那个方法那么简单易用,但因为它是标准库的一部分,所以(假设单位是标准的)它应该可以跨平台使用,适用于那些没有 /proc/ 的系统(比如 Mac OS X 和其他 Unix 系统,甚至可能是 Windows)。

另外,getrusage() 函数还可以传入 resource.RUSAGE_CHILDREN 来获取子进程的内存使用情况,某些系统上还可以使用 resource.RUSAGE_BOTH 来获取总的(包括自己和子进程)内存使用情况。

这个方法可以解决 memory_get_usage() 的问题,但不包括峰值使用量。我不太确定 resource 模块中是否还有其他函数可以提供峰值使用量的信息。

31

对于Linux和其他系统,使用/proc/self/status的一个简单解决方案是下面的代码,我在我的一个项目中使用了它:

def memory_usage():
    """Memory usage of the current process in kilobytes."""
    status = None
    result = {'peak': 0, 'rss': 0}
    try:
        # This will only work on systems with a /proc file system
        # (like Linux).
        status = open('/proc/self/status')
        for line in status:
            parts = line.split()
            key = parts[0][2:-1].lower()
            if key in result:
                result[key] = int(parts[1])
    finally:
        if status is not None:
            status.close()
    return result

这段代码可以返回当前和峰值的常驻内存大小(这大概就是人们提到一个应用程序使用了多少RAM时的意思)。而且你可以很容易地扩展这段代码,从/proc/self/status文件中获取其他信息。

如果你感兴趣的话,运行cat /proc/self/status的完整输出是这样的:

% cat /proc/self/status
Name:   cat
State:  R (running)
Tgid:   4145
Pid:    4145
PPid:   4103
TracerPid:      0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 32
Groups: 20 24 25 29 40 44 46 100 1000 
VmPeak:     3580 kB
VmSize:     3580 kB
VmLck:         0 kB
VmHWM:       472 kB
VmRSS:       472 kB
VmData:      160 kB
VmStk:        84 kB
VmExe:        44 kB
VmLib:      1496 kB
VmPTE:        16 kB
Threads:        1
SigQ:   0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   03
Cpus_allowed_list:      0-1
Mems_allowed:   1
Mems_allowed_list:      0
voluntary_ctxt_switches:        0
nonvoluntary_ctxt_switches:     0

撰写回答