我在多个地方看到有同学特别爱提「Python 内存溢出」,其实大部分是自己的程序逻辑写的有问题甚至是一种错觉,也有一些新人会提「如何知道我的程序使用了多少内存」这样的问题。那么如何去了解你的进程使用了多少内存呢?

最常用的就是 resource 模块,也是我最推荐的方案(我的书里面竟然没有写进去这部分内容,失败)。如果你感觉这个模块好陌生也是正常的,这个资源使用信息的模块平时确实用到的机会不多:

import resource

mem_init = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
l = []
for i in range(500000):
    l.append(object())
mem_final = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
del l
print('Class: {}:\n'.format(getattr(cls, '__name__')))
print('Initial RAM usage: {:14,}'.format(mem_init))
print('  Final RAM usage: {:14,}'.format(mem_final))

内存使用就是 mem_final - mem_init。但是要注意 2 点:

  1. 不同平台上 ru_maxrss 的值的单位是不一样的,在 OS X 上单位是 Byte,但是在 Linux 上单位是 KB。我之前用惯了 OS X,一次查看现在程序内存使用,看到上述方法的返回值太小,数量级上差了好多,觉得明显不对啊,困惑了很久,最后还是直接去翻 libbc 的手册 才知道这个区别。大家要注意。
  2. 上面用到的 resource.RUSAGE_SELF 表示当前进程自己,如果你希望知道该进程下已结束子进程的内存也计算进来,需要使用 resource.RUSAGE_CHILDREN。另外还有一个 RUSAGE_BOTH 相当于当前进程和子进程自己的总和,不过这个是平台相关的,你要先了解你是用的发行版本是否提供。