欢迎访问宙启技术站
智能推送

怎么使用Python中的timeit模块

发布时间:2023-05-17 19:45:03

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类。在使用时要注意:要测试的代码要尽量干净,不包含与测试无关的代码,并保证测试环境不产生任何影响。