Python itertools的"constant_factory"示例如何优于`lambda:x`?

650*_*502 6 python lambda python-itertools

在文档中defaultdict有这个例子:

>>> def constant_factory(value):
...     return itertools.repeat(value).next
Run Code Online (Sandbox Code Playgroud)

作为"更快,更灵活的创建常数功能的方式".

这是如何优越的

def constant_factory(value):
    return lambda : value
Run Code Online (Sandbox Code Playgroud)

请注意,当然没有人会为此定义一个函数...只是使用(lambda: 42)比调用更清晰,更短的类型constant_factory(42).

为了创建一个常量工厂返回一个mutable,如果需要的话可以使用(lambda x=[]:x)(顺便说一句,这是可以做的constant_factory([]),但它经常咬回来的东西......参见例如这个问题).

650*_*502 4

令人惊讶的是,在 Python 2 和 Python 3 中,使用速度itertools.repeat(value).next实际上大约快了30% 两到三倍(有明显的变化__next__)。

虽然不多,但也没有理由浪费。

PS:我想说这表明lambda可以改进(我看不出有什么逻辑原因可以让绑定方法比闭包更快),但lambda在 Python 社区中并没有得到真正的喜爱。

原因是itertools原语是用 C 实现的,而 lambda 执行的是 Python 字节码。仅返回捕获的值确实很快,但它仍然是字节码,并且需要像任何 Python 函数调用一样进行大量设置/拆卸。