2

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

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

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

这很好用,但我xlist的非常大(~20000 个浮点值),并且在我的程序执行期间这个总和被调用了几百万次,消耗了大部分时间资源。有没有办法以更有效的方式实现它?

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

4

2 回答 2

6

摆脱方括号应该可以解决问题。

sum(f(x) for x in xlist)

这将对生成器表达式求和,并且无需先创建存储在内存中的列表。相反,它将在迭代生成器时对元素求和。

在 Python 3 中,使用map(itertools.imap在 Python 2 中) 会更快一些。

import itertools
sum(itertools.imap(f, xlist))

您可以进行的进一步优化(因为将sum被多次调用)将消除使用.运算符的开销。

from itertools import imap
sum(imap(f, xlist))
于 2013-05-02T07:18:25.053 回答
2

我会推荐一种类似于Volatility 的方法。

而且还使用了一个Memoization 装饰器。(仅当您期望多个相同的值时才真正有用)

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)

资料来源:备忘录

于 2013-05-02T07:23:03.107 回答