分类目录:《系统学习Python》总目录
为方便比较,我们可以使用一个非装饰器方法,可作为计时迭代的替代方案。我们可以两个依调用的计时技巧——原生方法和库方法。这里部署下它们来计时装饰器的测试代码的IM列表推导案例,然而计时引发了管理代码的额外代价,其中包括一个外层循环和函数调用:
import timer
import timeit
def listcomp(N):
[x * 2 for x in range(x)]
print(timer.total(1, listcomp, 1000000))
print(timeit.timeit(number=1, stmt=lambda: listcomp(1000000)))
在这个特定的例子中,一种非装饰器的方法允许主体函数带有或不带有计时,但是当需要计时的时候,它也会使调用签名变得复杂一一一我们需要在每次调用的时候添加代码,而不是在def
中一次性添加代码。此外,在非装饰器方案中,可能没有直接的方法来保证一个程序中的所有列表构造器调用可以通过计时器逻辑发送,在找到所有签名并潜在地修改它们方面有所不足。这可能使得为全部的调用收集累计数据变得困难。
通常,当函数已经作为大型系统的一部分被部署时,装饰器可能更受欢迎,它们在调用时可能不会很容易地传递到分析函数。另一方面,因为装饰器使用扩增逻辑掌控对函数的每一次调用,如果你想要更有选择性地扩增调用,一个非装饰器的方法也许会更好。照常,不同的工具充当着不同的角色。
参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.