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更好,有什么原因吗?
发布于 2019-08-01 20:42:43
我只想说清楚:
[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()是一个纯函数)。
因此,一般来说,应该仔细检查用[y := f(x), y**2, y**3]替换[f(x), f(x)**2, f(x)**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.三次。当然,l1 == l2。
因此,要更直接地回答您的问题,您可能需要使用:
[f(x), f(x)**2, f(x)**3]而不是这个
y = f(x)
[y, y**2, y**3]当你对副作用特别感兴趣的时候,不管是什么。
发布于 2020-02-17 06:04:02
一个动态编程的海象,依赖于f(x)可能会更快。
e = 1
[e := e * f(x) for i in range(1, 4)]https://stackoverflow.com/questions/57309129
复制相似问题