【python】时间性能分析

时间:2021-02-03 19:10:42

参考:

http://blog.jobbole.com/47619/

http://chenpeng.info/html/1754

1.计算整个程序运行时间,直接用linux的time命令即可

time python progfrom.py

2.显示每一行程序运行的时间

用line_profiler

安装:

sudo apt-get install python-dev
pip install line_profiler

第一行不是必须的,但是有的时候直接写第二行会报错。

安装好后,会有提示,告诉你在哪个路径下生成了kernprof文件,我的是在/home/myname/.local/bin/kernprof

在想测量的函数上使用@profiler装饰器。不需要import任何东西
Primes.py

@profile
def primes(n):
if n==2:
return [2]
elif n<2:
return []
s=range(3,n+1,2)
mroot = n ** 0.5
half=(n+1)/2-1
i=0
m=3
while m <= mroot:
if s[i]:
j=(m*m-3)/2
s[j]=0
while j<half:
s[j]=0
j+=m
i=i+1
m=2*i+3
return [2]+[x for x in s if x]
primes(100) .
 

运行:

/home/myname/.local/bin/kernprof -l -v Primes.py

前面的路径就是kernprof的路径

可以通过 -help选项查看帮助

结果:

 
Wrote profile results to primes.py.lprof
Timer unit: 1e-06 s File: primes.py
Function: primes at line 2
Total time: 0.00019 s Line # Hits Time Per Hit % Time Line Contents
==============================================================
2 @profile
3 def primes(n):
4 1 2 2.0 1.1 if n==2:
5 return [2]
6 1 1 1.0 0.5 elif n<2:
7 return []
8 1 4 4.0 2.1 s=range(3,n+1,2)
9 1 10 10.0 5.3 mroot = n ** 0.5
10 1 2 2.0 1.1 half=(n+1)/2-1
11 1 1 1.0 0.5 i=0
12 1 1 1.0 0.5 m=3
13 5 7 1.4 3.7 while m <= mroot:
14 4 4 1.0 2.1 if s[i]:
15 3 4 1.3 2.1 j=(m*m-3)/2
16 3 4 1.3 2.1 s[j]=0
17 31 31 1.0 16.3 while j<half:
18 28 28 1.0 14.7 s[j]=0
19 28 29 1.0 15.3 j+=m
20 4 4 1.0 2.1 i=i+1
21 4 4 1.0 2.1 m=2*i+3
22 50 54 1.1 28.4 return [2]+[x for x in s if x] .
 

在里面寻找花费时间比较长的行,有些地方在优化之后能带来极大的改进。