pythonitertools'constant\u factory'示例如何优于'lambda:x`?
在pythonitertools'constant\u factory'示例如何优于'lambda:x`?,python,lambda,itertools,Python,Lambda,Itertools,在defaultdict的文档中有以下示例: >>> def constant_factory(value): ... return itertools.repeat(value).next 作为一种“创建常量函数的更快、更灵活的方法” 这比什么好 def constant_factory(value): return lambda : value ? 请注意,当然没有人会为此定义函数。。。仅使用(lambda:42)比调用常量工厂(42)更清晰、更简短 要
defaultdict
的文档中有以下示例:
>>> def constant_factory(value):
... return itertools.repeat(value).next
作为一种“创建常量函数的更快、更灵活的方法”
这比什么好
def constant_factory(value):
return lambda : value
?
请注意,当然没有人会为此定义函数。。。仅使用(lambda:42)
比调用常量工厂(42)
更清晰、更简短
要创建一个常量工厂,如果需要返回一个可变的,可以使用
(lambda x=[]:x)
(顺便说一句,这就是常量工厂([])
,但它经常会咬回去……例如,请参见)。使用itertools就足够令人惊讶了。重复(值).next实际上在Python2和Python3中都快了约30%两倍(明显的变化是\uuuuuuuuuuuuuuuu
)
它不多,但也没有理由浪费它
PS:我想说这表明lambda
可以改进(我看不出绑定方法比闭包更快的逻辑原因),但是lambda
在Python社区中并不受欢迎。
原因是,itertools
原语是用C实现的,而lambda执行Python字节码。仅仅返回捕获的值确实很快,但它仍然是字节码,需要像任何Python函数调用一样进行大量的设置/拆卸。也许itertools实现比一般的lambda优化和更快?这并不是说lambda
比itertools慢。重复,这是因为Python函数比C函数慢。如果检查字节码和函数类型,您将看到lambda
与def():返回值
完全等效。value
是一个闭包变量这一事实也可能发挥作用,但在我的测量中,硬编码的lamda:42
已经花费了1.77倍的时间,只要重复。