python解释器是否重用效率?

时间:2014-03-09 11:33:46

标签: python interpreter

#L is a very large list
A = [x/sum(L) for x in L]

当口译员对此进行评估时,计算总和(L)的次数是多少?只需一次,或每个元素一次?

2 个答案:

答案 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)使用带有默认参数的lambdamap,如果你想保留一个 - 班轮“,例如:

L = range(1, 10)
A = map(lambda el, total=sum(L, 0.0): el / total, L)