如何在Python中使用timeit函数测试代码性能
Python中的timeit模块提供了一种简单而准确的方法来测量代码的执行时间,它可以帮助我们评估代码的运行效率,找到耗时较长的函数或方法,对优化程序起到很大的作用。
timeit函数使用方法:
timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None)
其中,
stmt:被测代码,可以是一个字符串或一个函数对象
setup:运行代码前需要执行的代码,可选,一般用于导入模块或创建对象等操作
timer:计时器,Python默认的计时器是time.clock()
number:执行stmt的次数,默认为1000000
globals:全局命名空间,如果stmt是字符串,可以利用globals传递全局变量
下面我们来举一个例子:
在一个包含10000个整数的列表中查找特定的数,比较两种方法的运行效率
方法一:使用for循环逐个查找
def search1(lst, item):
for i in lst:
if i == item:
return True
return False
方法二:使用生成器表达式加入any函数
def search2(lst, item):
return any(i == item for i in lst)
我们可以使用timeit函数来测试这两种方法的性能
import timeit
lst = [i for i in range(10000)]
item = 9999
# 测试方法一
result1 = timeit.timeit("search1(lst, item)", setup="from __main__ import search1, lst, item", number=1000)
print("方法一耗时:", result1)
# 测试方法二
result2 = timeit.timeit("search2(lst, item)", setup="from __main__ import search2, lst, item", number=1000)
print("方法二耗时:", result2)
运行结果:
方法一耗时: 1.5024353084716797
方法二耗时: 0.06642913818359375
可以看到,使用生成器表达式加入any函数的方式比使用for循环逐个查找耗时更少,效率更高。
timeit函数的使用技巧:
1. 尽可能把需要测试的代码写在函数中,这样可以用函数对象替代字符串来进行测试,更加方便
2. 可以使用多行字符串来写setup和stmt,使得代码更加清晰易读
3. 可以使用repeat函数进行多次测试,找到一个较为准确的平均值
4. 可以使用time.process_time()函数来测量CPU时间,避免计时器误差和其他因素的影响
综上,timeit函数是Python中非常实用的工具,可帮助我们评估代码的运行效率,优化程序性能。在使用过程中,需注意以下几点:
1. 尽量使用函数对象来传递被测代码和setup代码
2. 可以使用repeat函数进行多次测试,得到平均值
3. 可以使用time.process_time()函数来测量CPU时间,避免计时器误差和其他因素的影响
