答案:Python代码执行时间测量需根据场景选择工具。使用time.perf_counter()可获得高精度、不受系统时间影响的单次计时;timeit模块通过多次重复执行并取最小值,减少外部干扰,适合小段代码性能对比;cProfile则用于分析复杂程序中各函数的调用次数、自身耗时(tottime)和累积耗时(cumtime),帮助定位性能瓶颈。优先选用time.perf_counter()替代time.time()以确保计时准确性。

Python代码执行时间的测量,核心在于选择合适的工具。从简单的计时器到复杂的性能分析器,它们各有侧重,帮助我们理解和优化代码的运行效率。选择合适的测量方法,能让你快速定位代码中的瓶颈,从而进行有针对性的优化。
当你需要了解一段Python代码到底跑了多久时,有几种方法可以派上用场。我通常会从最简单、最直观的开始,然后根据需要深入到更专业的工具。
1. 最直接的计时:time.perf_counter()
这是我个人最常用的快速测量方法。
time.perf_counter()
time.time()
立即学习“Python免费学习笔记(深入)”;
import time
def my_slow_function():
# 模拟一个耗时操作
sum(range(10**7))
start_time = time.perf_counter()
my_slow_function()
end_time = time.perf_counter()
print(f"my_slow_function 执行耗时: {end_time - start_time:.4f} 秒")2. 精准测量小段代码:timeit
如果你想对比不同实现方式的性能,或者需要对一小段代码进行更严谨、更独立的性能测试,
timeit
import timeit
# 假设我们要比较两种创建列表的方式
# 方式一:列表推导
stmt_list_comprehension = "[i for i in range(1000)]"
# 方式二:for循环append
stmt_for_loop_append = """
my_list = []
for i in range(1000):
my_list.append(i)
"""
# setup参数用于设置执行环境,避免在计时代码中包含设置逻辑
setup_code = ""
# 运行100000次,并重复测试5次,取最好的一次结果
time_lc = timeit.timeit(stmt=stmt_list_comprehension, setup=setup_code, number=100000, repeat=5)
time_fla = timeit.timeit(stmt=stmt_for_loop_append, setup=setup_code, number=100000, repeat=5)
print(f"列表推导耗时 (最佳5次中的一次): {min(time_lc):.6f} 秒")
print(f"for循环append耗时 (最佳5次中的一次): {min(time_fla):.6f} 秒")
# 你也可以直接用timeit.Timer类
timer = timeit.Timer(stmt_list_comprehension, setup_code)
print(f"列表推导 (Timer对象): {min(timer.repeat(repeat=5, number=100000)):.6f} 秒")3. 查找性能瓶颈:cProfile
当你的代码结构比较复杂,包含多个函数调用,而你又不确定是哪个函数拖慢了整体速度时,
cProfile
profile
import cProfile
import time
def func_a():
time.sleep(0.01) # 模拟IO或计算
func_b()
func_c()
def func_b():
sum(range(10**5)) # 模拟CPU密集型计算
def func_c():
time.sleep(0.005)
def main_program():
for _ in range(5):
func_a()
# 运行cProfile
cProfile.run('main_program()')
# 另一种更灵活的使用方式,可以保存结果并用pstats分析
# import pstats
# pr = cProfile.Profile()
# pr.enable()
# main_program()
# pr.disable()
# pr.dump_stats('profile_output.pstats')
#
# # 在另一个脚本或交互式环境中分析
# # p = pstats.Stats('profile_output.pstats')
# # p.sort_stats('cumulative').print_stats(10) # 按累积时间排序,打印前10行cProfile
time.perf_counter()
time.time()
说实话,我以前也习惯用
time.time()
time.time()
相比之下,
time.perf_counter()
time.perf_counter()
timeit
我个人觉得
timeit
首先,它在一个相对“干净”的环境中执行你的代码。当你使用
timeit.timeit()
timeit.Timer
setup
其次,也是最关键的,
timeit
number
repeat
timeit
此外,
timeit
timeit
cProfile
tottime
cumtime
说实话,
cProfile
cProfile
ncalls
tottime
tottime
percall
cumtime
cumtime
percall
如何利用它们定位问题?
我通常会这样分析:
首先看cumtime
cumtime
cumtime
tottime
cumtime
tottime
接着看tottime
cumtime
tottime
注意ncalls
tottime
cumtime
ncalls
举个例子,假设你有一个函数
process_data()
read_file()
transform_data()
read_file()
read_file()
tottime
process_data()
cumtime
read_file()
process_data()
tottime
read_file()
transform_data()
transform_data()
tottime
process_data()
cumtime
process_data()
tottime
transform_data()
通过这种方式,你可以像侦探一样,一步步地缩小范围,最终定位到代码中真正需要优化的地方。这比盲目地猜测或优化那些看起来“复杂”但实际不耗时的代码要有效得多。
以上就是Python怎么测量代码的执行时间_Python代码性能计时与分析方法的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号