哪一个是在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 ...
答案 0 :(得分:11)
评估每次迭代。看看这个:
>>> def f():
... print("func")
...
>>> [f() for i in range(4)]
func
func
func
func
[None, None, None, None]
正如你所说,如果f()没有副作用,那么将返回值存储在变量上并使用该变量可以快得多。
答案 1 :(得分:10)
我可能会选择后者,因为Python编译器不知道该函数是否有副作用,因此为每个元素调用它。
答案 2 :(得分:7)
这是一个简单的方法:
>>> def f():
... print "called"
... return 1
...
>>> [1+f() for x in xrange(5)]
called
called
called
called
called
[2, 2, 2, 2, 2]
所以是的,如果函数每次都相同,那么最好在列表理解之外调用一次。
答案 3 :(得分:2)
将为每个元素调用函数f
。
答案 4 :(得分:1)
编译器/解释器确定不需要多次调用函数是非常复杂的。那么很可能多次调用该函数。因此,使用第二种解决方案始终是最佳解决方案。
答案 5 :(得分:1)
与名称查找相比,函数具有非平凡的执行时间,如果多次调用该函数并且每次都预期相同的值,则认为缓存该值是可接受的。
答案 6 :(得分:0)
Python可能可以自由地执行一次或多次,我不确定我会依赖任何观察到的行为。它可能会在下一个版本中发生变化。
如果确保只调用一次该功能对您来说很重要,请自行调用并保存结果。