我已经开始使用line_profiler
. 现在,我正在通过运行来做到这一点
kernprof -l -v myFile.py
但是,时间单位似乎在1e-6
,这导致输出结果如132329040
。如何增加时间间隔以使输出对于更大的时间增量更具可读性?
我已经开始使用line_profiler
. 现在,我正在通过运行来做到这一点
kernprof -l -v myFile.py
但是,时间单位似乎在1e-6
,这导致输出结果如132329040
。如何增加时间间隔以使输出对于更大的时间增量更具可读性?
这是迄今为止仅通过 Jupyter line magic 提供的功能,如此处所述。它可以通过“-u”标志访问,后跟计时器单元,以秒为单位。这是一个示例用法:
def m():
return [0]*10**8
%lprun -u 1e-3 -f m m()
以毫秒为单位显示带有计时器单位的输出:
Out:
Timer unit: 0.001 s
Total time: 0.363548 s
File:
Function: m at line 1
Line # Hits Time Per Hit % Time Line Contents
==============================================================
1 def m():
2 1 363.5 363.5 100.0 return [0]*10**8
如本PR中所述。
我通过阅读 LineProfiler 源代码找到了解决方案。您可以使用以下参数“output_unit”来更改时间单位。
profiler.print_stats(output_unit=1e-03)
output_unit=1e-03,控制台输出“Timer unit: 0.001 s” output_unit=1,控制台输出“Timer unit: 1 s”
在 show_func 函数中;在第 202 行附近:
if output_unit is None:
output_unit = unit
将其更改为:
if output_unit is None:
output_unit = unit*1000000
其次,在函数show_text中;在第 254 行附近:
if output_unit is not None:
stream.write('Timer unit: %g s\n\n' % output_unit)
else:
stream.write('Timer unit: %g s\n\n' % unit)
将其更改为:
if output_unit is not None:
stream.write('Timer unit: %g s\n\n' % output_unit)
else:
stream.write('Timer unit: %g s\n\n' % (unit*1000000))
在两个地方使用相同的因子。
当我使用行命令运行 line_profiler 而不是 ipython/jupyter 时,我进行了上述更改。
输出文件如下所示。时间单位更具可读性!
executed
Wrote profile results to test.py.lprof
Timer unit: 0.1 s
Total time: 1.00024 s
File: test.py
Function: testfunc at line 5
Line # Hits Time Per Hit % Time Line Contents
==============================================================
5 @profile
6 def testfunc():
7 1 10.0 10.0 100.0 time.sleep(1)
8 1 0.0 0.0 0.0 print('executed')
使用“ms”显示:
编辑line_profiler.py
-> show_func -> 找到for lineno, nhits, time in timings:
这一行 -> 更改time
为time * 10-03