系统学习Python——装饰器:函数装饰器-[对调用计时:测试细节]

分类目录:《系统学习Python》总目录


文章《系统学习Python——装饰器:函数装饰器-[对调用计时:装饰器与每次调用计时]》中的脚本是如何使用其force设置来使它在Python2.X和Python3.X之间可移植。map内置函数在Python3.X中返回一个按需求生成结果的可迭代对象,但是在Python2.X中返回一个实际的列表。因此,Python3.X的map本身不能直接相比于列表推导的工作。实际上,如果没有把其包装在一个list调用中来迫使结果生成,map测试在Python3.X中几乎不花任何时间一一一它返回一个可迭代对象而没有进行迭代。

同时,在Python2.X也添加这一list调用,会花费map多余的时间,看上去不太公平,因为map测试的结果将会包含创建两个列表所需的时间,而不是一个。为了变通解决这一问题,脚本依据在sys模块中的Python版本号选择了map的一个外层函数:在Python3.X中采用list,而在Python2.X中使用一个无操作函数简单地返回它的输人参数,保持其不变。这会在Python2.X中增加一个非常小的常量时间,被计时函数中的内层循环迭代所花费的时间很可能掩盖它。

尽管这使得在Python2.X或Python3.X中在列表推导和map之间进行比较更为公平,因为range在Python3.X中也是一个迭代器,但是Python2.X和Python3.X的结果不能直接比较,除非你还将这一调用提升到计时代码的外部。它们是相对可比较的(并在各自系列中显现为最佳实践代码),但是range迭代只在Python3.X中增加额外时间。

最后,正如我们之前为跟踪器装饰器所做的,我们可通过在文件底部的一个name测试下面缩进自测试代码,来使计时装饰器在其他模块中可重用,因为缩进后只有当文件运行的时候才运行测试代码,而不是导人后运行。然而这里我们不会这么做,因为我们打算给代码添加另一项功能。

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.

你可能感兴趣的:(系统学习Python,Python,python,装饰器,函数,类,对象,方法)