通过设计,Python将便利性,可读性和易用性置于性能之上。 但这并不意味着您应该适应缓慢的Python代码。 您可能需要采取一些措施来加快速度。
在可用于分析Python代码性能的工具中,最简单的是timeit
模块。 timeit
用于通过执行数千次甚至数百万次代码并报告这些执行完成所需的时间来测量小段代码(几行,一个函数)的速度。
[ 同样在InfoWorld上:如何在Python中使用asyncio ]
timeit
对于比较两种或三种不同的方式来做某事并查看哪种最快是最有用的。 例如,运行数千次迭代的循环是Python的常见瓶颈。 如果您找到一种加快执行该循环的方法(例如,使用Python内置而不是手写代码),则可以得到可观的性能改进。
一个简单的Python timeit示例
下面是如何一个简单的例子timeit
工作:
def f1():
for n in range(100):
pass
def f2():
n=0
while n<100:
n+=1
if __name__ == "__main__":
import timeit
print (timeit.timeit(f1, number=100000))
print (timeit.timeit(f2, number=100000))
该程序比较了两种方法循环执行100次的性能:使用Python的内置range
函数( f1
)和增加变量( f2
)。 timeit
将这些方法中的每一个运行100,000次,并在最后为每个方法提供总的运行时间。 默认情况下, timeit
使用一百万次运行,但是此示例显示了如何将运行次数设置为任何看起来合适的数字。
结果(来自Intel i7-3770K处理器):
0.1252315
0.45453989999999994
显然, range
方法要快得多,大约是3.75倍。 这不足为奇。 与手动操作Python对象相比,使用内置的Python通常会产生更好的性能。
[ 也在InfoWorld上:更好的Python项目和Poetry的依赖管理 ]
通过传递字符串使用Python timeit
使用timeit
另一种方法是传递一个被评估为Python程序的字符串:
import timeit
print (timeit.timeit('for n in range(100):pass'))
也可以从命令行完成:
python -m timeit "for n in range(100):pass"
但是,总的来说,使用上面显示的技术会更容易,因为您无需笨拙地将代码插入文本字符串。
Python timeit提示
有用,因为timeit
是,要记住这些告诫有关如何使用它。
避免将timeit用于整个程序分析
没有什么说不能用timeit
为整个程序计时的。 例如,一个简单的10行脚本不是以这种方式进行概要分析的不二之选。
但是,有更好的工具可以完成这项工作,例如Python的cProfile
模块,它可以生成有关整个程序性能的更详细的统计信息。 timeit
与单个组件或代码段(即功能或几行代码)一起使用时效果最佳。 超过此限制的值通常会产生过于嘈杂且不一致的结果,从而无法为您提供任何有意义的性能信息。
此外,如果该程序你分析需要很多的时间才能完成, timeit
不会有太大用处。 首先,运行代码多次会花费太长时间,因此收集的时间将非常粗糙。 对于两个而言,其他工具更适合该工作。
在不同的机器上执行多个timeit运行
程序并非每次都以相同的速度运行。 现代计算环境带来了很多不确定性-与其他程序在资源,缓存行为,调度等方面的竞争。 timeit
试图通过无限执行代码来弥补这一点,但是聚合多个试验仍然是一个好主意。 您应该多次运行timeit
配置文件,扔掉最差和最好的分数,然后平均其余的分数。
[ 通过InfoWorld的App Dev Report新闻通讯了解软件开发中的热门话题 ]
最后,它还有助于在不同的系统上运行相同的测试:与传统的旋转硬盘驱动器相比,磁盘绑定的磁盘在SSD上的性能如何? 与其他有关性能的问题一样,请不要猜测,测试。
From: https://www.infoworld.com/article/3532491/how-to-use-timeit-to-profile-python-code.html