2

Pythonで関数呼び出しの結果の合計を見つけるための(並列処理に入ることなく)最も速い方法は何ですか?

Imaginexlistは値のリストです。目的は、それぞれを変換しf(x)て合計することです。今のところ(「フラットの方が常に良い」ことを念頭に置いて)私は以下を持っています:

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

これは問題なく動作しますが、myxlistはかなり大きく (~20000 float 値)、この合計はプログラムの実行中に数百万回呼び出され、ほとんどの時間リソースを消費します。より効率的な方法で実装する方法はありますか?

C++ のインクルージョンやその他の考えられる方法を追加してもかまいませんが、そのためにプログラム全体の構造を変更したくはありません...

4

2 に答える 2

6

角かっこを取り除くとうまくいくはずです。

sum(f(x) for x in xlist)

これにより、ジェネレータ式が合計され、最初にメモリに格納されるリストを作成する必要がなくなります。むしろ、ジェネレーターを反復するときに要素を合計します。

Python 3 では、map( itertools.imapPython 2 で) を使用すると少し速くなります。

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

( がかなりの回数呼び出されるため) 実行できるさらなる最適化は、演算子sumを使用するオーバーヘッドを取り除くことです。.

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

ボラティリティと同様のアプローチをお勧めします。

しかし、メモ化デコレータも使用します。(複数の同一の値が予想される場合にのみ非常に役立ちます)

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 に答える