2

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 更好?

4

2 回答 2

7

只是为了说清楚:

[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()函数)。

所以,一般来说,更换[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.三遍。当然,l1 == l2


因此,要更直接地回答您的问题,您可能需要使用:

[f(x), f(x)**2, f(x)**3]

而不是这个

y = f(x)
[y, y**2, y**3]

当您对副作用特别感兴趣时,无论是什么。

于 2019-08-01T12:42:42.757 回答
1

具有动态编程的海象,它可能会更快取决于f(x).

e = 1
[e := e * f(x) for i in range(1, 4)]
于 2020-02-16T22:04:02.180 回答