python - 配置所有导入的内存成本?

标签 python memory profiling

我不太确定这是否可能...

我有一个大型 Python 应用程序,它会增长到很大的内存大小。我希望通过 import 语句跟踪进程增长,尽可能减少它。

我发现最接近的是 memory_profiler 的线路分析功能。不过,这只会分析“顶层”import 语句的内存 - 我想要所有从属导入的分割。我还没有找到任何可以跟踪导入语句的内存大小的分析器。

这不仅是为了优化我们自己的代码,而且因为最近的审计显示一些 PyPi 模块通过简单地将 import 语句放在 try/except block 中来启用第 3 方框架支持。

例如,一个图书馆这样做:

try:
    import bottle
    # declare bottle support here
except:
    pass

虽然我的应用程序部署在 virtualenv 中,但还有其他几个同级服务是部署的一部分并在同一个 virtualenv 中运行...其中一个使用 bottle

这种“模式”在我使用的少数库中使用,不需要/不需要的模块的开销占该应用程序内存印记的相当数量(基于手动隔离和测量它们)。我想弄清楚哪些库应该优先修补,哪些我可以安全地忽略。

最佳答案

在运气不佳之后,我有了一个古怪的想法,而且有点奏效。

我覆盖了 import 语句来计算每次导入前后给定进程的当前内存。我不认为这涵盖了所有进口情况,但这是一个好的开始。我只是打印了这个,然后将其复制/粘贴到一个文件中,然后进行了一些快速预处理,将其转换为一个 csv 文件,用于跟踪索引和每次调用的增长百分比/总数。这足以满足我目前的需求。

import os
import psutil
import __builtin__
this_process = psutil.Process(os.getpid())
realimport = __builtin__.__import__
def myimp(name, *args, **kwargs):
    try:
        _mem_start = this_process.get_memory_info()[0]
        r = realimport(name, *args, **kwargs)
        _mem_finish = this_process.get_memory_info()[0]
        _mem_growth = _mem_finish - _mem_start
        print "import|%s,%s,%s,%s" % (name, _mem_growth, _mem_start, _mem_finish)
        return r
    except:
        raise
__builtin__.__import__ = myimp

上面有更好的方法,我仍然希望有更好的方法来分析这样的应用程序。现在,我有一个可行的解决方案。

关于python - 配置所有导入的内存成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40144010/

相关文章:

php - 使用 Zend 获取更新时修改的字段

profiling - 如何分析 JRuby 代码?

python - 对任意数量的数组的所有可能组合求和并应用限制并返回索引

python - 使用带有 Pmw 模块的 pyinstaller 创建 python 3 exe

c - 将字符串存储在共享内存 C 上

python - Python 何时为相同的字符串分配新内存?

profiling - Sandy Bridge QPI 带宽性能事件

python - 使用 Django 管理界面进行动态(JS/Ajax)字段更新

python - 如何获得每行打印一个单词的列表?

c - 当我想将数组写入文件时内存损坏