性能——timeit模块
我们会使用timeit模块来将不同面向对象设计和Python结构进行对比,timeit模块包含了很多函数。重点关注的是timeit,这个函数会为一些语句创建一个Timer对象,也会包含一些预备环境的安装代码,然后调用Timer的timeit()方法来执行一次安装过程并重复执行目标语句。返回值为运行语句所需的时间。
默认计数为100000次。这提供了一个有意义的平均时间值,来自其他计算机上OS级别活动的统计。对于复杂的或长时间运行的语句,需要谨慎使用小计数值。
以下是与timeit简单交互的示例代码:
>>> timeit.timeit( "obj.method()", """
… class SomeClass:
… def method(self):
… pass
… obj= SomeClass()
""")
0.1980541350058047
| 下载示例代码 你可以通过自己的帐号下载所有从Packt出版社所购买的书籍中的示例代码:http://www.packtpub.com。如果你是从其他地方购买的,可以访问 http://www.packtpub.com/support并注册,我们会通过邮件形式发送给你。 |
obj.method()语句以字符串的形式提供给timeit(),安装为类定义并且也由字符串的形式提供。语句中所需要的任何东西都必须在安装中提供,它包括所有的导入和所有的变量定义以及对象创建。
可能会需要多尝试几次来完成安装过程。当使用交互式Python时,经常会由于命令行窗口的翻屏导致无法追踪全局变量和导入信息。有一个例子是,10000次空方法的调用,花了0.198秒。
以下是另一个使用timeit的例子:
>>> timeit.timeit( "f()","""
… def f():
… pass
… """ )
0.13721893899491988
这个例子说明了,空函数的调用会比空方法的调用略快一些,在这个例子中差不多为44%。
在一些情况下,OS的开销可以作为性能的测量组件,它们通常源自难以控制的因素。在这个模块中可以使用repeat()函数来替代timeit()函数。它会收集基本定时的多个样本,对OS在性能上的影响做进一步分析。
对于我们而言,timeit()函数会提供所有反馈信息,我们可用于在客观上对不同面向对象涉及的要素进行评估。
