在Python中查找函数调用结果总和的最快方法(不进行并行处理)是什么?
想象一下xlist
是一个值列表,目的是用f(x)
转换它们并总结。现在(记住“平坦总是更好”)我有:
sum([f(x) for x in xlist])
这样可以正常工作,但我的xlist
非常大(约20000个浮点值),在执行程序时,这个总和被称为几百万次,占用了大部分时间资源。有没有办法以更有效的方式实现它?
我不介意添加C ++包含或你能想到的任何其他方法,但不想为了它而改变整个程序的结构......
答案 0 :(得分:6)
摆脱方括号应该可以解决问题。
sum(f(x) for x in xlist)
这将总结生成器表达式,并且无需先创建存储在内存中的列表。相反,它会在迭代生成器时对元素求和。
在Python 3中,使用map
(Python 2中的itertools.imap
)会更快一些。
import itertools
sum(itertools.imap(f, xlist))
您可以进行的进一步优化(因为sum
将被称为公平几次)将消除使用.
运算符的开销。
from itertools import imap
sum(imap(f, xlist))
答案 1 :(得分:2)
我建议使用类似于Volatility's.
的方法但也使用Memoization decorator。 (只有在您期望多个相同的值时才真正有用)
def memodict(f):
""" Memoization decorator for a function taking a single argument """
class memodict(dict):
def __missing__(self, key):
ret = self[key] = f(key)
return ret
return memodict().__getitem__
@memodict
def f(x):
pass # your code
sum(f(x) for x in xlist)
来源:Memodict