Python等价于PHP的memory_get_usage()?

2024-04-28 18:02:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经有了found the following question,但是我想知道是否有一种更快更脏的方法来获取python解释器当前为我的脚本使用的不依赖外部库的内存的估计值。

我来自PHP,经常使用memory_get_usage()memory_get_peak_usage()来实现这个目的,我希望能找到一个等价的。


Tags: the方法内存目的脚本getusage估计值
3条回答

一个简单的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

接受的应答规则,但使用psutil可能更容易(而且更便于移植)。它做同样的事,而且做得更多。

更新:muppy也非常方便(而且比guppy/heapy有更好的文档记录)。

您还可以使用标准库模块中的getrusage()函数。结果对象具有属性ru_maxrss,该属性给出调用进程的总峰值内存使用量:

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

Python docs并不清楚这些单位到底是什么,但是用于getrusage(2)Mac OS X man page将这些单位描述为千字节。

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模块的任何其他函数是否可以提供峰值使用率。

相关问题 更多 >