分类目录:《系统学习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.