【问题标题】:python - profile the memory cost of all imports?python - 分析所有导入的内存成本?
【发布时间】:2016-10-20 01:23:56
【问题描述】:

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

我有一个大型 Python 应用程序,它会增长到很大的内存大小。我希望通过import 语句跟踪流程增长,以尽量减少这种情况。

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

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

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

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

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

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

【问题讨论】:

  • 使用sys.getsizeof怎么样?例如。 import pandas; print(getsizeof(pandas))
  • 这不适用于模块。 pympler 有一个 asizeof 功能,但似乎可以工作。不过,我最终覆盖了 import 语句,因为这给了我一个导入的顺序(这使得追踪起来更容易一些)。

标签: python memory profiling


【解决方案1】:

在运气不佳之后,我有了一个古怪的想法,并且它有些工作。

我覆盖了import 语句来计算每次导入前后给定进程的当前内存。我不认为这涵盖了所有进口情况,但这是一个好的开始。我只是打印了这个,然后将其复制/粘贴到一个文件中,然后进行了一些快速预处理以将其转换为一个 csv,该 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

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

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多