我正在编写一个接口来帮助我分析python脚本。我从profile.py source code借用了执行python脚本的代码。我意识到,当我连续两次分析同一代码时,第二次它会返回不同数量的函数调用。例如,在myscript.py
上执行以下代码:
from cProfile import Profile
import sys
import os.path
for i in range(3):
prof = Profile()
progname = 'myscript.py'
sys.path.insert(0, os.path.dirname(progname))
with open(progname, 'rb') as fp:
code = compile(fp.read(), progname, 'exec')
globs = {
'__file__': progname,
'__name__': '__main__',
'__package__': None,
'__cached__': None,
}
prof.runctx(code, globs, None)
prof.create_stats()
print(len(prof.stats))
给了我
511
30
30
作为输出。为什么第二次调用的函数数量会变少?哪个号码是右边的号码?我怎样才能两次都得到相同的结果?你知道吗
myscript.py
看起来像:
import numpy
import numpy.linalg
if __name__ == '__main__':
r = numpy.random.rand(1000, 1000)
numpy.linalg.inv(r)
函数调用计数不同的原因似乎是因为
myscript.py
导入的模块在第二次运行代码时不会再次导入。你知道吗获得一致结果的第一种方法是在执行评测之前导入
myscript.py
。但是,这意味着如果我导入的模块在导入时执行某些任务,则不会对此进行分析。你知道吗我发现的第二种方法是删除执行脚本时注册的所有模块。这样做的好处是,如果在GUI运行时修改源代码,它将重新加载更改。我现在的缺点是,一些atexit注册的处理程序现在崩溃了,因为需要的模块在以下情况下被删除:
最后,我发现最好的方法是在一个单独的进程中执行分析:
相关问题 更多 >
编程相关推荐