列表推导中函数 - 是否多次计算
在Python中,哪种写法的列表推导更好(从计算时间和CPU周期的角度来看)?在例子(1)中,函数f(r)是在每次循环中都计算一次,还是只计算一次然后保存起来?
y = [x*f(r) for x in xlist]
c = f(r)
y = [x*c for x in xlist]
其中
def f(r):
... some arbitrary function ...
7 个回答
10
这里有一个简单的方法可以找到答案:
>>> def f():
... print "called"
... return 1
...
>>> [1+f() for x in xrange(5)]
called
called
called
called
called
[2, 2, 2, 2, 2]
所以,如果这个函数每次都一样的话,最好是在列表推导式外面调用一次。
14
每次循环都会进行计算。看看这个:
>>> def f():
... print("func")
...
>>> [f() for i in range(4)]
func
func
func
func
[None, None, None, None]
正如你所说,如果 f() 没有副作用,把返回值存到一个变量里,然后用这个变量代替,效率会高很多。
12
我可能会选择后者,因为Python的编译器不知道这个函数是否会有副作用,所以它会对每个元素都调用一次这个函数。