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([]),但它经常咬回来的东西......参见例如这个问题).
令人惊讶的是,在 Python 2 和 Python 3 中,使用速度itertools.repeat(value).next实际上大约快了30% 两到三倍(有明显的变化__next__)。
虽然不多,但也没有理由浪费。
PS:我想说这表明lambda可以改进(我看不出有什么逻辑原因可以让绑定方法比闭包更快),但lambda在 Python 社区中并没有得到真正的喜爱。
原因是itertools原语是用 C 实现的,而 lambda 执行的是 Python 字节码。仅返回捕获的值确实很快,但它仍然是字节码,并且需要像任何 Python 函数调用一样进行大量设置/拆卸。
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |