我试图创建一个模块,让你基本上可以做同样的PyCharm专业版,在程序执行期间获取配置文件快照,但作为模块而不是整个UI
为了做到这一点,我试图首先创建一个接收另一个脚本路径的脚本并打印后面脚本的配置文件(我将始终假设后面的脚本有一个 main )。
这是我得到的:
import cProfile
import imp
pr = cProfile.Profile()
pr.disable()
def profileScript(script):
pr.enable()
pr.run('script')
pr.disable()
pr.print_stats()
if __name__ == '__main__':
script = imp.load_source('meihn','A:\TestProgram\meihn.py')
profileScript(script)
和测试脚本i' m profiling:
def func1(a,b):
return a + b
def func2(lista, listb):
listc = []
for i in range(0, len(lista)):
listc.append(func1(lista[i],listb[i]))
return listc
def func3(list):
a = 1
for i in list:
a *= i
return a
if __name__ == '__main__':
for i in range(0, 1000):
la = [1, 2, 3, 4]
lb = [5, 5, 5, 5]
lc = func2(la, lb)
ld = func2(la, lc)
le = func2(lb, lc)
input()
for i in range(0, 10000):
lf = func3(le)
input()
它会运行,但它不会在输入处停止,结果如下:
5 function calls in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 cProfile.py:132(run)
1 0.000 0.000 0.000 0.000 cProfile.py:137(runctx)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {method 'enable' of '_lsprof.Profiler' objects}
Process finished with exit code 0
这基本上告诉我它没有调用meihn.py中的任何函数,我认为这是因为它没有因为某些原因而调用main。
对此以及如何进行异步快照的任何评论都会有很大的帮助。
我正在使用python 2.7
提前致谢。
答案 0 :(得分:0)
很抱歉打破它,但你的测试脚本没有任何可以调用的主要功能。 : - )
无论如何,我的脚本有相同的结果,它有一个主要功能。我认为探查器无法“透视”你的呼叫机制。
通过查看cProfile.py
,我想出了以下解决方案:
import os
import sys
import cProfile
pr = cProfile.Profile()
pr.disable()
def profile_script(progname):
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,
}
pr.enable()
pr.runctx(code, globs, None)
pr.disable()
pr.print_stats()
if __name__ == '__main__':
profile_script('A:\TestProgram\meihn.py')
此外,我稍微修改了您的测试脚本,因为将input
与exec
一起使用会导致语法错误:
def func1(a, b):
return a + b
def func2(lista, listb):
listc = []
for i in range(0, len(lista)):
listc.append(func1(lista[i],listb[i]))
return listc
def func3(list):
a = 1
for i in list:
a *= i
return a
if __name__ == '__main__':
for i in range(0, 1000):
la = [1, 2, 3, 4]
lb = [5, 5, 5, 5]
lc = func2(la, lb)
ld = func2(la, lc)
le = func2(lb, lc)
raw_input('input: ')
for i in range(0, 10000):
lf = func3(le)
raw_input('input: ')
这给了我:
43098 function calls in 11.249 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
4 0.000 0.000 0.000 0.000 Queue.py:107(put)
4 0.000 0.000 0.000 0.000 Queue.py:204(_put)
1 0.000 0.000 11.249 11.249 cProfile.py:137(runctx)
1 0.023 0.023 11.249 11.249 meihn.py:1(<module>)
12000 0.002 0.000 0.002 0.000 meihn.py:1(func1)
10000 0.010 0.000 0.010 0.000 meihn.py:12(func3)
3000 0.030 0.000 0.035 0.000 meihn.py:5(func2)
4 0.000 0.000 0.001 0.000 pydev_console_utils.py:145(__pydev_run_command)
2 0.000 0.000 11.180 5.590 pydev_console_utils.py:154(readline)
4 0.000 0.000 0.000 0.000 pydevd_comm.py:427(add_command)
4 0.000 0.000 0.000 0.000 pydevd_comm.py:567(__init__)
4 0.000 0.000 0.000 0.000 pydevd_comm.py:843(make_input_requested_message)
4 0.000 0.000 0.000 0.000 pydevd_utils.py:69(is_string)
4 0.000 0.000 0.000 0.000 pydevd_utils.py:72(to_string)
4 0.000 0.000 0.000 0.000 pydevd_utils.py:86(quote_smart)
4 0.000 0.000 0.000 0.000 threading.py:299(_is_owned)
4 0.000 0.000 0.000 0.000 threading.py:372(notify)
4 0.000 0.000 0.000 0.000 threading.py:63(_note)
4 0.000 0.000 0.000 0.000 urllib.py:1248(quote)
8 0.000 0.000 0.000 0.000 {isinstance}
3000 0.000 0.000 0.000 0.000 {len}
8 0.000 0.000 0.000 0.000 {method 'acquire' of 'thread.lock' objects}
4 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}
12000 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {method 'enable' of '_lsprof.Profiler' objects}
2 11.179 5.590 11.179 5.590 {method 'readline' of 'file' objects}
7 0.000 0.000 0.000 0.000 {method 'release' of 'thread.lock' objects}
3 0.000 0.000 0.000 0.000 {method 'remove' of 'list' objects}
4 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}
3002 0.001 0.000 0.001 0.000 {range}
2 0.001 0.000 11.181 5.590 {raw_input}