PEP572中的海象运算符示例

时间:2019-08-01 12:30:01

标签: python pep

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

2 个答案:

答案 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)]