我正在使用memory_profiler
分析我的代码from memory_profiler import profile
@profile
def whatever():
....
....
所以,正如你们许多人可能知道我在屏幕上得到类似的输出:
Line # Mem usage Increment Line Contents
==============================================
3 @profile
4 5.97 MB 0.00 MB def my_func():
5 13.61 MB 7.64 MB a = [1] * (10 ** 6)
6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)
7 13.61 MB -152.59 MB del b
8 13.61 MB 0.00 MB return a
我的问题是:
由于@profile进程需要花费很多时间,我想知道我是否可以以某种方式记录/存储此输出,并让脚本保持运行,可能是在晚上。
我的想法是在许多def函数中使用装饰器@profile,并将所有结果以某种方式存储在单个TXT或许多不同的TXT文件中,这不是重要的,重要的是如果可能的话。
答案 0 :(得分:5)
来自评论:
如果你刚开始
run_my_thing > output.txt
在shell中,您可以将stdout
存储在文件中。
这将完全绕过memory_profiler。显然,重新定位stdout
并不理想,但如果它用于人工分析,则不应该是一个大问题。
答案 1 :(得分:3)
我没有尝试过,但似乎很简单 - 来自docs:
报告
通过将IO流传递为,可以将输出重定向到日志文件 装饰器的参数,如@profile(stream = fp)
>>> fp=open('memory_profiler.log','w+')
>>> @profile(stream=fp)
>>> def my_func():
... a = [1] * (10 ** 6)
... b = [2] * (2 * 10 ** 7)
... del b
... return a
对于许多txt / log文件,即分别保存各种函数/代码块的结果 - 在装饰函数时传递不同的文件对象:
fp=open('memory_profiler.log','w+')
@profile(stream=fp)
def func1():
# statements
fp2=open('memory_profiler2.log', 'w+')
@profile(stream=fp2)
def func2():
# statements
.....
下行:许多开放式连接。
记录多个文件的优雅方式是使用RotatingFileHandler
:
有时候特别使用记录器模块会非常方便 当我们需要使用RotatingFileHandler时。 只需使用即可将输出重定向到记录器模块 内存分析器模块的LogFile
from memory_profiler import LogFile
import sys
sys.stdout = LogFile('memory_profile_log')
答案 2 :(得分:0)