Python 怎么计时?别再迷茫,超实用Python代码计时技巧全攻略,精准掌控代码运行时间!
话说,写 Python 代码,谁还没遇到过“这玩意儿跑得咋这么慢?”的情况?这时候,计时就显得尤为重要了。知道瓶颈在哪儿,才能对症下药,不是吗?别担心,今天我就来分享几个我常用的 Python 计时方法,简单粗暴,保证你一看就懂,上手就能用!
首先,最经典,也最常用的,肯定要数 time
模块了。
time.time()
这玩意儿,简单到不能再简单。它返回的是当前时间的时间戳(timestamp),也就是从1970年1月1日午夜开始到现在经过的秒数。所以,要计时,只需要在代码块前后分别调用一下 time.time()
,然后相减,就得到代码块的运行时间了,单位是秒。
“`python
import time
start_time = time.time()
这里放你要计时的代码
for i in range(100000):
pass
end_time = time.time()
running_time = end_time – start_time
print(f”代码运行时间:{running_time} 秒”)
“`
看到了吧?三行代码搞定计时!但是,这种方法有个缺点,就是精度不够高,只能精确到秒级别。如果你需要更精确的计时,比如毫秒级别,甚至微秒级别,那就要祭出 time.perf_counter()
或者 time.monotonic()
这两个神器了。
time.perf_counter()
的设计初衷就是为了测量短时间内的性能。它返回的是一个高精度的时间值,但是这个值的起点是未定义的,所以只能用来测量时间间隔,不能用来获取当前时间。记住,千万别拿它来当 time.time()
用!
“`python
import time
start_time = time.perf_counter()
这里放你要计时的代码
result = sum(i for i in range(1000001))
end_time = time.perf_counter()
running_time = end_time – start_time
print(f”代码运行时间:{running_time} 秒”)
“`
而 time.monotonic()
则保证返回的时间是单调递增的,不会因为系统时间调整而受到影响。这在需要保证时间一致性的场景下非常有用。用法和 time.perf_counter()
几乎一样,区别在于适用场景不同。
有时候,我们只想对某行代码进行简单的计时,不想写那么多代码,这时候怎么办呢?别忘了 Python 强大的装饰器!我们可以自定义一个计时装饰器,用起来超级方便。
“`python
import time
import functools
def timer(func):
“””计算函数运行时间的装饰器”””
@functools.wraps(func)
def wrapper(args, kwargs):
start_time = time.perf_counter()
result = func(args, **kwargs)
end_time = time.perf_counter()
running_time = end_time – start_time
print(f”函数 {func.name} 运行时间:{running_time} 秒”)
return result
return wrapper
@timer
def my_function(n):
“””一个简单的函数,计算前n个整数的和”””
return sum(i for i in range(n + 1))
result = my_function(1000000)
print(f”结果:{result}”)
“`
看到了没?只需要在函数上面加上 @timer
,就可以自动计时了!这酸爽,谁用谁知道!
当然,如果你需要更高级的计时功能,比如统计函数被调用了多少次,每次调用的平均运行时间等等,那么 timeit
模块就是你的不二之选了。
timeit
模块专门用于测量小段 Python 代码的执行时间。它会多次运行你的代码,然后取平均值,从而减少偶然因素的干扰,使结果更加准确。
“`python
import timeit
要计时的代码字符串
code_to_test = “””
result = sum(i for i in range(1000001))
“””
创建 Timer 对象,指定要执行的代码和setup代码
timer = timeit.Timer(code_to_test, setup=”pass”) #setup可以放一些初始化代码
运行代码多次,并返回总时间
number = 10 # 执行10次
total_time = timer.timeit(number=number)
print(f”代码运行 {number} 次的总时间:{total_time} 秒”)
print(f”每次运行的平均时间:{total_time / number} 秒”)
“`
timeit
的用法稍微复杂一些,需要先创建一个 Timer
对象,然后调用 timeit()
方法。timeit()
方法会多次运行你的代码,然后返回总时间。你还可以通过 number
参数指定代码运行的次数。
还有一个值得一提的工具是 cProfile
,这是一个 Python 自带的性能分析器。它可以帮你找出代码中的瓶颈,告诉你哪些函数调用最多,哪些函数运行时间最长。虽然它主要用于性能分析,但同时也提供了非常详细的计时信息。我更倾向于用它分析整个程序的性能瓶颈。
用起来也很简单:
“`python
import cProfile
import pstats
def my_function():
result = sum(i for i in range(1000001))
return result
使用 cProfile 分析代码
cProfile.run(‘my_function()’, ‘profile_output’)
使用 pstats 模块读取分析结果
p = pstats.Stats(‘profile_output’)
按照运行时间排序,并打印结果
p.sort_stats(‘cumulative’).print_stats(10) # 打印最耗时的10个函数
“`
运行这段代码后,会生成一个 profile_output
文件,里面包含了程序的性能分析数据。然后,我们可以使用 pstats
模块来读取这些数据,并按照各种指标进行排序和显示。
总而言之,Python 计时的方法有很多种,选择哪种取决于你的具体需求。如果只是简单地测量代码块的运行时间,time.time()
或者 time.perf_counter()
就足够了。如果需要更精确的计时,或者需要统计函数被调用的次数和平均运行时间,那么 timeit
模块是更好的选择。而 cProfile
则可以帮你找出代码中的瓶颈,进行更深入的性能分析。希望这些技巧能帮你更好地掌握 Python 代码的运行时间,提升你的编程效率!相信我,掌握了计时技巧,你的 Python 代码一定会跑得更快!
最后,想说的是,代码优化是一个循序渐进的过程,不要指望一步到位。先通过计时找出瓶颈,然后逐步优化,不断迭代,最终才能写出高效的代码。加油!
评论(0)