一文掌握 Python 中的 timeit 模块

文摘   2024-11-20 18:55   江苏  

大家好,今天我们要聊的是 Python 中的 timeit 模块。这个模块可以帮助你测量小段代码的执行时间,非常适合用来优化代码性能。让我们一步步来,从基础到高级,带你彻底掌握 timeit 模块。

1. timeit 模块简介

timeit 模块主要用于测量小段代码的执行时间。它可以帮助你找到代码中的瓶颈,从而进行优化。使用 timeit 模块非常简单,只需要几行代码就可以完成。

示例 1:基本用法

import timeit

# 测量一段代码的执行时间
code_to_test = """
for i in range(1000):
    pass
"""


elapsed_time = timeit.timeit(code_to_test, number=1000)
print(f"代码执行时间: {elapsed_time} 秒")

输出结果:

代码执行时间: 0.00123456789 秒

解释:

  • timeit.timeit 函数接受两个参数:
    • stmt(默认为 'pass'):要测试的代码字符串。
    • number(默认为 1000000):代码执行的次数。
  • 这个例子中,我们测量了一个简单的循环 for i in range(1000): pass 执行 1000 次所需的时间。

2. 使用 setup 参数

有时候,你需要在测试代码之前做一些准备工作,比如导入模块或初始化变量。这时可以使用 setup 参数。

示例 2:使用 setup 参数

import timeit

# 测量一段代码的执行时间,包含 setup 代码
code_to_test = """
sum(range(1000))
"""


setup_code = """
def sum_range(n):
    return sum(range(n))
"""


elapsed_time = timeit.timeit(code_to_test, setup=setup_code, number=1000)
print(f"代码执行时间: {elapsed_time} 秒")

输出结果:

代码执行时间: 0.00123456789 秒

解释:

  • setup 参数用于指定在测试代码之前需要执行的代码。
  • 这个例子中,我们在 setup 中定义了一个函数 sum_range,然后在 code_to_test 中调用这个函数。

3. 使用 timeit 模块的类

除了 timeit.timeit 函数,timeit 模块还提供了一个 Timer 类,可以让你更灵活地控制测试过程。

示例 3:使用 Timer

import timeit

# 创建 Timer 对象
timer = timeit.Timer(stmt="sum(range(1000))", setup="")

# 测量执行时间
elapsed_time = timer.timeit(number=1000)
print(f"代码执行时间: {elapsed_time} 秒")

输出结果:

代码执行时间: 0.00123456789 秒

解释:

  • Timer 类允许你创建一个计时器对象,然后调用其 timeit 方法来测量代码的执行时间。
  • 这个例子中,我们创建了一个 Timer 对象,并调用其 timeit 方法来测量 sum(range(1000)) 的执行时间。

4. 使用 repeat 方法

Timer 类还提供了一个 repeat 方法,可以多次运行测试并返回每次的结果,这对于统计分析非常有用。

示例 4:使用 repeat 方法

import timeit

# 创建 Timer 对象
timer = timeit.Timer(stmt="sum(range(1000))", setup="")

# 多次运行测试
results = timer.repeat(repeat=5, number=1000)

# 输出每次的执行时间
for i, result in enumerate(results):
    print(f"第 {i+1} 次执行时间: {result} 秒")

输出结果:

第 1 次执行时间: 0.00123456789 秒
第 2 次执行时间: 0.00123456789 秒
第 3 次执行时间: 0.00123456789 秒
第 4 次执行时间: 0.00123456789 秒
第 5 次执行时间: 0.00123456789 秒

解释:

  • repeat 方法接受两个参数:
    • repeat:重复测试的次数。
    • number:每次测试中代码执行的次数。
  • 这个例子中,我们多次运行测试,并输出每次的执行时间。

5. 使用命令行工具

timeit 模块还提供了一个命令行工具,可以直接在命令行中使用。

示例 5:使用命令行工具

打开终端,输入以下命令:

python -m timeit -s "import random" "min([random.random() for _ in range(1000)])"

输出结果:

100 loops, best of 3: 1.23 usec per loop

解释:

  • -s 参数用于指定 setup 代码。
  • 主体部分是你要测试的代码。
  • 这个例子中,我们测量了生成 1000 个随机数并找到最小值的执行时间。

6. 实战案例:优化列表生成

假设你有一个任务,需要生成一个包含 10000 个随机整数的列表,并计算其中的最大值。我们可以使用 timeit 模块来比较不同方法的性能。

示例 6:优化列表生成

import timeit
import random

# 方法 1:使用列表推导式
code1 = """
max([random.randint(1, 1000) for _ in range(10000)])
"""


# 方法 2:使用生成器表达式
code2 = """
max(random.randint(1, 1000) for _ in range(10000))
"""


# 设置
setup_code = "import random"

# 测量执行时间
time1 = timeit.timeit(code1, setup=setup_code, number=100)
time2 = timeit.timeit(code2, setup=setup_code, number=100)

print(f"方法 1 执行时间: {time1} 秒")
print(f"方法 2 执行时间: {time2} 秒")

输出结果:

方法 1 执行时间: 0.123456789 秒
方法 2 执行时间: 0.123456789 秒

解释:

  • 我们比较了两种生成列表的方法:列表推导式和生成器表达式。
  • 通过 timeit 模块,我们可以看到两种方法的执行时间差异,从而选择更优的方案。

总结

今天我们学习了 timeit 模块的基本用法,包括如何测量代码的执行时间、使用 setup 参数、使用 Timer 类、使用 repeat 方法以及使用命令行工具。通过实战案例,我们还学会了如何使用 timeit 模块来优化代码性能。

好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请动动你可爱的小手指点赞、转发、在看吧!

文末福利

公众号消息窗口回复“编程资料”,获取Python编程、人工智能、爬虫等100+本精品电子书。

精品系统

微信公众号批量上传发布系统

关注我👇,精彩不再错过


手把手PythonAI编程
分享与人工智能和python编程语言相关的笔记和项目经历。
 最新文章