在Python中求和(f(x))的最快方法

时间:2013-05-02 07:15:46

标签: python python-2.7

在Python中查找函数调用结果总和的最快方法(不进行并行处理)是什么?

想象一下xlist是一个值列表,目的是用f(x)转换它们并总结。现在(记住“平坦总是更好”)我有:

sum([f(x) for x in xlist])

这样可以正常工作,但我的xlist非常大(约20000个浮点值),在执行程序时,这个总和被称为几百万次,占用了大部分时间资源。有没有办法以更有效的方式实现它?

我不介意添加C ++包含或你能想到的任何其他方法,但不想为了它而改变整个程序的结构......

2 个答案:

答案 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