我不太确定这是否可能...
我有一个大型 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/