1. 在命令行中使用timeit
在终端中直接运行代码片段并测量执行时间:
python -m timeit "'-'.join(str(n) for n in range(100))"
输出示例:
20000 loops, best of 5: 15.7 usec per loop
精确测量代码执行时间,优化Python程序性能
在优化Python代码性能时,准确测量代码段的执行时间至关重要。Python的timeit
模块提供了简单而强大的方法来精确计时,避免了手动使用time.time()
可能引入的误差。
在终端中直接运行代码片段并测量执行时间:
python -m timeit "'-'.join(str(n) for n in range(100))"
输出示例:
20000 loops, best of 5: 15.7 usec per loop
在Python代码中导入timeit模块进行测量:
import timeit
# 测量简单表达式
execution_time = timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
print(f"执行时间: {execution_time:.4f} 秒")
# 测量多行代码
setup_code = "from math import sqrt"
test_code = """
def calc():
return [sqrt(x) for x in range(1000)]
"""
execution_time = timeit.timeit(stmt=test_code, setup=setup_code, number=1000)
print(f"函数执行时间: {execution_time:.4f} 秒")
通过重复测量获得更可靠的结果:
import timeit
# 重复测量5次,每次运行10000遍
results = timeit.repeat('"-".join([str(n) for n in range(100)])',
number=10000,
repeat=5)
print(f"测量结果: {results}")
print(f"最佳时间: {min(results):.5f} 秒")
使用timeit测量自定义函数的执行时间:
import timeit
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
# 测量函数执行时间
execution_time = timeit.timeit(lambda: factorial(20), number=10000)
print(f"阶乘函数执行时间: {execution_time:.6f} 秒")
使用timeit比较两种不同实现的性能差异:
import timeit
# 方法1: 使用列表推导式
list_comp = timeit.timeit('[x**2 for x in range(1000)]', number=10000)
# 方法2: 使用map函数
map_func = timeit.timeit('list(map(lambda x: x**2, range(1000)))', number=10000)
print(f"列表推导式: {list_comp:.5f} 秒")
print(f"map函数: {map_func:.5f} 秒")
print(f"性能差异: {abs(list_comp - map_func)/min(list_comp, map_func)*100:.1f}%")
比较四种不同字符串拼接方法的性能:
import timeit
# 四种字符串拼接方法
methods = {
'加号拼接': 's = ""; for i in range(1000): s += str(i)',
'join方法': '"".join(str(i) for i in range(1000))',
'列表推导式+join': '"".join([str(i) for i in range(1000)])',
'map+join': '"".join(map(str, range(1000)))'
}
# 测试每种方法的性能
results = {}
for name, code in methods.items():
t = timeit.timeit(code, number=1000)
results[name] = t
print(f"{name}: {t:.5f} 秒")
# 找出最快的方法
fastest = min(results, key=results.get)
print(f"\n最快的方法是: {fastest}, 耗时: {results[fastest]:.5f} 秒")
比较列表和字典的查找性能:
import timeit
import random
# 准备数据
setup = """
n = 10000
lst = list(range(n))
dct = {i: i for i in range(n)}
target = random.randint(0, n-1)
"""
# 测量列表查找
list_time = timeit.timeit('target in lst', setup=setup, number=10000)
# 测量字典查找
dict_time = timeit.timeit('target in dct', setup=setup, number=10000)
print(f"列表查找时间: {list_time:.5f} 秒")
print(f"字典查找时间: {dict_time:.5f} 秒")
print(f"字典比列表快 {list_time/dict_time:.1f} 倍")
在setup中导入所需模块,避免在测试代码中访问全局变量,这会影响测量结果。
对于执行时间很短的代码,增加number参数以获得更准确的结果。
确保被测试的代码没有副作用,或者每次测试前重置环境状态。
使用timeit.repeat()多次运行测试,并取最小值作为最终结果,避免系统波动影响。
Python的timeit
模块是测量代码执行时间的强大工具,对于性能优化至关重要。通过本教程,您已经学会了:
在实际开发中,定期使用timeit进行性能测试,可以帮助您发现代码中的瓶颈,做出更有效的优化决策。
本文由WangZhiJiao于2025-08-14发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20258144.html
发表评论