列表推导中函数 - 是否多次计算

25 投票
7 回答
35970 浏览
提问于 2025-04-16 18:28

在Python中,哪种写法的列表推导更好(从计算时间和CPU周期的角度来看)?在例子(1)中,函数f(r)是在每次循环中都计算一次,还是只计算一次然后保存起来?

  1. y = [x*f(r) for x in xlist]

  2. 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的编译器不知道这个函数是否会有副作用,所以它会对每个元素都调用一次这个函数。

撰写回答