list list comprehension中的函数 - 它被多次评估

dil*_*ert 21 python list-comprehension

哪一个是在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 ...
Run Code Online (Sandbox Code Playgroud)

utd*_*mir 12

它评估每次迭代.看这个:

>>> def f():
...     print("func")
... 
>>> [f() for i in range(4)]
func
func
func
func
[None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

如你所说,如果f()没有副作用,将返回值存储在变量上并使用该变量则是一个更快的解决方案.


Asg*_*eir 11

我可能会选择后者,因为Python编译器不知道该函数是否具有副作用,因此为每个元素调用它.


Dav*_*rby 8

这是一个简单的方法来找出:

>>> def f():
...     print "called"
...     return 1
...
>>> [1+f() for x in xrange(5)]
called
called
called
called
called
[2, 2, 2, 2, 2]
Run Code Online (Sandbox Code Playgroud)

所以是的,如果函数每次都相同,那么最好在列表理解之外调用一次.