怎么使用Python中的timeit模块
Python中的timeit模块是一个用于测量代码执行时间的工具。它可以帮助我们确定哪些部分的代码需要提高效率,可以有效地帮助我们改进我们的代码。
timeit模块可以在命令行中使用,也可以在Python代码中导入使用。本篇文章将介绍Python中timeit模块的基本用法。
1. 命令行使用
在命令行中,我们可以使用timeit命令来测试代码的执行时间。以下是timeit命令的语法:
timeit [-n N] [-r N] [-t] [-c] [-p] [-h] [statement]
其中,各个参数的含义如下:
-n N:执行语句的次数为N次。默认为1。 -r N:重复测试N次。默认为3次。 -t:输出总共的执行时间。 -c:将测试代码作为字符串传入。 -p:打印相应测试结果的完整信息。 -h:打印帮助信息并退出。 statement:需要测试的Python语句或代码块。
timeit命令使用示例:
我们可以测试一个简单的Python语句:
$ timeit -n 10000 -r 3 -c "a = 1 + 2"
这里我们测试了一万次,循环测试三次,代码是 a = 1 + 2。
输出结果为:
10000 loops, best of 3: 0.0222 usec per loop
我们也可以测试一个Python脚本:
$ timeit -n 10000 -r 3 myfile.py
2. Python代码中使用
使用Python代码中的timeit模块,我们需要导入模块,使用Timer类来测试代码执行时间。以下是基本语法:
from timeit import Timer t = Timer(stmt, setup) print(t.timeit(number=1))
其中:
stmt:需要执行的Python语句或代码块。
setup:在测试stmt之前执行的Python语句或代码块,一般是一些初始化信息。
number:重复测试的次数,默认为1。
使用范例:
比较两种list初始化方法的执行时间,代码如下:
from timeit import Timer
def test1():
li = []
for i in range(1000):
li += [i]
def test2():
li = []
for i in range(1000):
li.append(i)
t1 = Timer("test1()", "from __main__ import test1")
print("concat", t1.timeit(number=1000), "milliseconds")
t2 = Timer("test2()", "from __main__ import test2")
print("append", t2.timeit(number=1000), "milliseconds")
输出结果为:
concat 1.1483085280412434 milliseconds append 0.0662662989987017 milliseconds
这里我们对 test1() 和 test2() 这两个函数进行了性能测试,输出结果如下:
- concat:1.1483ms
- append:0.0663ms
从结果中可以看出用append方法的性能更好。
再给一个例子:计算列表平方的运算时间。
import math
from timeit import Timer
def test1():
l = [i**2 for i in range(1000)]
def test2():
l = []
for i in range(1000):
l.append(i**2)
def test3():
l = list(map(lambda x: x ** 2, range(1000)))
def test4():
l = list(map(lambda x: math.pow(x, 2), range(1000)))
t1 = Timer("test1()", "from __main__ import test1")
t2 = Timer("test2()", "from __main__ import test2")
t3 = Timer("test3()", "from __main__ import test3")
t4 = Timer("test4()", "from __main__ import test4")
print("list comprehension: ", t1.timeit(number=1000))
print("for loop: ", t2.timeit(number=1000))
print("list map and lambda: ", t3.timeit(number=1000))
print("list map and math: ", t4.timeit(number=1000))
输出结果为:
list comprehension: 0.2433288 for loop: 0.3061748 list map and lambda: 0.44566060000000004 list map and math: 0.5555697999999999
从结果中可以看出,Python的列表生成式(list comprehension)表现 。
总结
使用timeit模块可以很方便地测试Python脚本或代码块的执行时间,帮助我们优化代码。命令行中可以用timeit命令,Python代码中可以使用timeit模块的Timer类。在使用时要注意:要测试的代码要尽量干净,不包含与测试无关的代码,并保证测试环境不产生任何影响。
