想知道你的Python代码跑得有多慢?或者想对比一下两种算法哪个更快?这都离不开Python计时。别担心,这事儿其实不难,方法还挺多。

最简单粗暴的,莫过于time模块了。time.time()这玩意儿,能直接返回当前的时间戳,精确到秒。在代码前后分别记录一下,相减,就得到了代码运行的时长。

“`python
import time

start_time = time.time()

这里放你的代码,比如:

for i in range(100000):
pass # 空循环,模拟耗时操作

end_time = time.time()

elapsed_time = end_time – start_time
print(f”代码运行时间:{elapsed_time:.4f} 秒”)
“`

是不是很简单?但time.time()有个缺点,它的精度可能不够高,尤其是在测量非常短的代码片段时,误差会比较大。而且,它返回的是墙上时间,也就是实际流逝的时间,会受到系统时间的影响,比如你电脑上的其他程序占用了CPU,或者系统时间突然被调整了,都会影响计时的结果。这,可是个大问题!如果你的benchmark至关重要,那么要小心使用!

想要更精确的计时?time.perf_counter()了解一下。它返回的是一个性能计数器的值,专门用来测量代码片段的运行时间。它不受系统时间的影响,精度也更高,能达到纳秒级别。

“`python
import time

start_time = time.perf_counter()

这里放你的代码

result = sum(i for i in range(1000000))

end_time = time.perf_counter()

elapsed_time = end_time – start_time
print(f”代码运行时间:{elapsed_time:.4f} 秒”)
“`

注意到了吗?从time.time()换成了time.perf_counter(),感觉是不是专业多了?但其实,它们的使用方法是类似的。 只是背后的机制不一样。选择合适的计时器,对你的程序而言至关重要!

还有个time.process_time(),它测量的是进程的CPU时间,也就是代码实际占用CPU的时间。这个时间不包括等待IO的时间,比如等待用户输入、等待网络请求等。如果你想知道代码的CPU效率,用它就对了。

“`python
import time

start_time = time.process_time()

这里放你的代码

time.sleep(2) # 模拟IO等待

end_time = time.process_time()

elapsed_time = end_time – start_time
print(f”代码CPU运行时间:{elapsed_time:.4f} 秒”)
“`

这里,我故意加了个time.sleep(2),模拟IO等待。你会发现,即使程序运行了2秒多,但CPU时间可能只有几毫秒,因为大部分时间都在等待IO。所以,理解这三种计时器的区别,才能选对工具。否则,你会得到错误的结论!

除了time模块,Python还有一个更高级的计时工具:timeit模块。它能自动多次运行你的代码,然后计算平均运行时间,这样可以消除一些随机误差,让计时结果更准确。

“`python
import timeit

定义要计时的代码片段

my_code = “””
result = sum(i for i in range(1000000))
“””

使用timeit.timeit()函数进行计时

elapsed_time = timeit.timeit(stmt=my_code, number=10) #运行10次

print(f”代码运行时间:{elapsed_time:.4f} 秒”)
“`

timeit.timeit()函数接受两个主要参数:stmt是要计时的代码片段,number是运行的次数。timeit会自动处理一些细节,比如禁用垃圾回收,确保计时的准确性。而且它能处理字符串形式的代码片段,非常灵活。想想看,是不是比手动计时方便多了?

如果你想更方便地使用timeit,还可以用命令行模式。在终端输入python -m timeit "你的代码",就能直接运行计时。

比如:

bash
python -m timeit "sum(i for i in range(1000))"

这对于快速测试一些简单的代码片段非常有用。不过别忘了把代码用引号括起来!

说完了基本用法,我们再来聊点高级的。 比如,如何测量函数的运行时间?很简单,把函数调用放到timeitstmt参数里就行了。

“`python
import timeit

def my_function(n):
return sum(i for i in range(n))

使用timeit.timeit()函数进行计时

elapsed_time = timeit.timeit(stmt=”my_function(1000000)”, setup=”from main import my_function”, number=10)

print(f”函数运行时间:{elapsed_time:.4f} 秒”)
“`

这里,setup参数用来导入函数。因为timeit是在一个独立的环境中运行代码的,所以需要显式地导入函数。

再说说上下文管理器。Python的contextlib模块提供了一个contextmanager装饰器,可以让你很方便地创建一个上下文管理器,用来测量代码块的运行时间。

“`python
import time
import contextlib

@contextlib.contextmanager
def timer(name):
start_time = time.perf_counter()
yield
end_time = time.perf_counter()
elapsed_time = end_time – start_time
print(f”{name} 运行时间:{elapsed_time:.4f} 秒”)

with timer(“My Code”):
# 这里放你的代码
result = sum(i for i in range(1000000))
“`

这个timer函数就是一个上下文管理器,你可以用with语句来使用它。当进入with代码块时,timer会记录开始时间;当退出with代码块时,timer会计算运行时间并打印出来。这种方式更加优雅,而且可以嵌套使用,方便测量多个代码块的运行时间。

总结一下,Python提供了多种计时方法,从简单的time.time()到精确的time.perf_counter(),再到方便的timeit模块和上下文管理器,你可以根据自己的需求选择合适的工具。 掌握这些技巧,能帮助你更好地了解代码的性能,从而进行优化,提升程序的效率。 计时,不仅仅是了解代码运行时间,更是优化代码的基础。 选择适合的计时方式,才能得到准确的结果,从而进行有效的优化。 别再让你的代码跑得慢吞吞的了!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。