计算Python函数的运行时间

有时候需要计算一下函数的时间,可以有以下的几种方式:

简单粗暴式

1
2
3
4
5
6
7
8
9
import time
def func():
pass
if __name__ == '__main__':
start = time.time()
func()
print time.time() - start

升级版1

使用装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import time
def count_running_time(func):
def _count_running_time(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
print('cost time :{0}'.format(time.time() - start))
return res
return _count_running_time
@count_running_time
def func():
pass
if __name__ == '__main__':
func()

升级版2

通过上下文管理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from contextlib import contextmanager
@contextmanager
def count_time():
start_time = time.time()
print("开始执行")
yield
print("执行结束,耗时{}".format(time.time() - start_time))
if __name__ == '__main__':
with count_time():
print("hi")

以上的方式,只能简单统计函数的总运行时间,如果函数复杂,需要分析里边调用的次数和耗时,则满足不了我们的需求。

更精确的统计方式

使用cProfile来进行统计,使用pstats来分析结果,直接看代码吧~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import time
def profile_func(func):
import cProfile
cProfile.run("{}()".format(func.func_name),"prof.txt")
import pstats
p = pstats.Stats("prof.txt")
p.sort_stats("time").print_stats()
def func():
print 'hello world'
import time
time.sleep(3)
if __name__ == '__main__':
profile_func(func)

打印如下:

1
2
3
4
5
6
7
8
9
10
11
12
hello world
Sat Apr 16 17:19:10 2016 prof.txt
4 function calls in 3.000 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1 3.000 3.000 3.000 3.000 {time.sleep}
1 0.000 0.000 3.000 3.000 C:/Py27Project/testtools/local_test/__init__.py:12(func)
1 0.000 0.000 3.000 3.000 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

函数调用的次数和耗时一目了然~