#L is a very large list
A = [x/sum(L) for x in L]
当口译员对此进行评估时,计算总和(L)的次数是多少?只需一次,或每个元素一次?
答案 0 :(得分:3)
列表推导执行每次迭代的表达式 。
每个sum(L)
都会执行 x in L
。计算一次在外面列表理解:
s = sum(L)
A = [x/s for x in L]
Python无法知道sum(L)
的结果是否稳定,并且无法为您优化呼叫。
sum()
可以反弹到返回随机值的不同函数。 L
中的元素可以实现产生副作用的__add__
方法;内置的sum()
会调用这些。 L
本身可以实现自定义__iter__
方法,在迭代时就地修改列表,同时影响列表理解和 sum()
调用。任何这些钩子都可以重新绑定sum
或赋予x
元素一个__div__
方法来改变sum
等。
换句话说,Python过于动态,无法准确预测表达结果。
答案 1 :(得分:1)
我会选择Martijn的方法,但我想我会指出你可以(ab)使用带有默认参数的lambda
和map
,如果你想保留一个 - 班轮“,例如:
L = range(1, 10)
A = map(lambda el, total=sum(L, 0.0): el / total, L)