Python:timeit库使用方法
timeit库:
-
timeit库定义了接受两个参数的Timer类。两个参数都是字符串。 第一个参数是要计时的语句或者函数;第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境, 手工地执行建立语句,然后手工地编译和执行被计时语句。
-
一旦有了 Timer 对象,最简单的事就是调用 timeit(),它接受一个参数为每个测试中调用被计时语句的次数,默认为一百万次;返回所耗费的秒数。
- Timer 对象的另一个主要方法是 repeat(), 它接受两个可选参数。 第一个参数是重复整个测试的次数,第二个参数是每个测试中调用被计时语句的次数。 两个参数都是可选的,它们的默认值分别是 3 和1000000。 repeat() 方法返回以秒记录的每个测试循环的耗时列表。Python 有一个方便的 min 函数可以把输入的列表返回成最小值,如: min(t.repeat(3, 1000000))
测试一个列表推导式与for循环的时间:
import timeit
foooo = """
sum = []
for i in range(1000):
sum.append(i)
"""
print(timeit.timeit(stmt="[i for i in range(1000)]", number=100000))
print(timeit.timeit(stmt=foooo, number=100000))
# 结果
# 3.0098994999999604
# 5.630418200000008
通过10w次循环,发现使用列表推导式要比正常使用list追加元素会快上近5秒左右,速度快上近三倍。
timeit库抽象出了两个可以直接使用的方法,下面看一下模块里面的代码:
def timeit(stmt="pass", setup="pass", timer=default_timer,
number=default_number, globals=None):
"""Convenience function to create Timer object and call timeit method."""
return Timer(stmt, setup, timer, globals).timeit(number)
def repeat(stmt="pass", setup="pass", timer=default_timer,
repeat=default_repeat, number=default_number, globals=None):
"""Convenience function to create Timer object and call repeat method."""
return Timer(stmt, setup, timer, globals).repeat(repeat, number)
测试一个函数的执行时间:
from timeit import timeit
def func():
s = 0
for i in range(1000):
s += i
print(s)
# timeit(函数名_字符串,运行环境_字符串,number=运行次数)
t = timeit('func()', 'from __main__ import func', number=1000)
print(t)
由于电脑永远都有其他程序也在占用着资源,程序不可能最高效的执行。所以一般都会进行多次试验,取最少的执行时间为真正的执行时间。
from timeit import repeat
def func():
s = 0
for i in range(1000):
s += i
#repeat和timeit用法相似,多了一个repeat参数,表示重复测试的次数(可以不写,默认值为3.),返回值为一个时间的列表。
t = repeat('func()', 'from __main__ import func', number=100, repeat=5)
print(t)
print(min(t))