PEP572中给出的示例之一是
# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]
当前在python中,您必须执行以下操作之一:
# option 1
y = f(x)
[y, y**2, y**3]
或
# option 2
[f(x), f(x)**2, f(x)**3]
该示例暗示可以对此处的选项2进行改进,但是我从未见过建议在第一个选项上进行推荐。有没有理由为什么选项2(以及海象运算符)会比选项1更好?
答案 0 :(得分:3)
只是要弄清楚:
[y := f(x), y**2, y**3]
等效于:
y = f(x)
[y, y**2, y**3]
({f(x)
仅被调用一次)
但通常不是这样:
[f(x), f(x)**2, f(x)**3]
({f(x)
被叫了三次)
由于潜在的f()
副作用(或潜在的不必要的计算负担,如果f()
是 pure 函数)。
因此,通常应仔细检查将[f(x), f(x)**2, f(x)**3]
替换为[y := f(x), y**2, y**3]
。
例如:
def f(x):
print('Brooks was here.')
return 2 * x
x = 1
y = f(x)
l1 = [y, y**2, y**3]
同时打印Brooks was here.
一次,
l2 = [f(x), f(x)**2, f(x)**3]
将打印Brooks was here.
3次。
当然是l1 == l2
。
因此,为了更直接地回答您的问题,您可能需要使用:
[f(x), f(x)**2, f(x)**3]
不是这个
y = f(x)
[y, y**2, y**3]
当您对副作用特别感兴趣时,无论可能如何。
答案 1 :(得分:1)
具有动态编程的海象,它可能更快,具体取决于f(x)
。
e = 1
[e := e * f(x) for i in range(1, 4)]