我们在做性能分析的时候,最常用的方法就是统计程序的耗时;通过分析耗时,来确定需要优化和改进的部分。
今天我们分享几个统计耗时的方法,希望对你有帮助。
1. time.time()
一种直接的方式就是利用时钟方式,统计程序前后的实时时间,然后计算耗时。
import time
def test_func_2(cnt):
start_time = time.time()
sum_v = 0
for i in range(cnt):
if i % 3 == 0:
sum_v += i
print("time is: {}".format(time.time() - start_time))
return sum_v
test_func_2(10000000)
# time is: 0.5772514343261719
由上可知,time.time()
这种方式,需要变更函数内的逻辑,但是比较灵活,可以检测函数内更小代码块的耗时。也可以通过装饰器的方式来统计。
2. timeit
另一种方式是通过python的内置库timeit。 timeit中timeit函数提供了单个函数或者语句的耗时统计,例子如下:
from timeit import timeit
def test_func(cnt):
sum_v = 0
for i in range(cnt):
if i % 3 == 0:
sum_v += i
return sum_v
t2 = timeit("test_func(100000)", setup="from __main__ import test_func", number=1)
print(t2)
由上可知,timeit的好处是在函数外部测试耗时,不改变函数体内容。timeit还提供运行的次数number;timeit库中还提供repeat函数,提供反复执行的。需要注意的是timeit函数中setup是函数测试的前置命令,一般为模块导入。
3. cProfile
另一个统计耗时的工具也是python的内置库cProfile。cProfile提供了详细的性能分析信息。
import cProfile
from timeit import timeit
def test_func(cnt):
sum_v = 0
for i in range(cnt):
if i % 3 == 0:
sum_v += i
return sum_v
cProfile.run("test_func(100000)")
从上可知,ncalls表示调用次数、tottime为总耗时(不包括调用)、percall为每次调用耗时、cumtime为总耗时(包括调用)、percall为每次调用耗时、filename:lineno(function)为函数信息。
4. 总结
今天分享了3种python中统计程序耗时的方法,总结如下:
- time.time(): 最常用灵活的方式,便于发现函数中更小模块的耗时
- timeit:在不改变函数内容的情况下方便统计函数耗时,所以尽可能拆分功能为可测试的函数模块
- cProfile: 一个更全面的耗时统计工具