2009-05-12 14 views
10

forループよりも速く番号リストを集計する方法はありますか?おそらくPythonライブラリにありますか?それとも、本当にマルチスレッド/ベクトル処理だけが効率的に行うことができるのでしょうか?forループよりも数値のリストを高速に集める方法はありますか?

編集:明確にするために、ユーザーから入力された、並べ替えられていない任意の数字のリストにすることができます。

+1

あなたは本当に「速い」を意味するか、またはあなたが「Python的」を意味するのですか?コードの中でボトルネックとなっている数字のリストを集計して最適化が必要ですか? –

答えて

32

sum()を使用すると、配列の値を合計できます。

a = [1,9,12] 
print sum(a) 
2

は、リスト内の各用語は、単純に1ずつ増加した場合、またはあなたがシリーズのパターンを見つけることができれば、あなたはn項を合計するための式を見つけることができます。例えば、一連{1,2,3、...、N}の和= N(N + 1)/ 2

よりhere

1

ウェルを読むことと、私は知りませんより高速ですが、あなたはそれを1つの操作にするために少しの計算を試みることができます。 (N *(N + 1))/ 2は、1からNまでのすべての数の和を返します。より複雑な合計を解くための他の数式もあります。

0

一般的なリストについては、総数を得るためには、少なくともすべてのメンバーを少なくとも1回は渡す必要があります。これはforループとまったく同じです。ライブラリーAPI(sumなど)を使用するほうが便利ですが、実際にはより高速になるとは思えません。ループ時間でリストを総括する

+0

C言語で書かれているので、sum()はforループより高速です。 –

+0

@musicfreak: forループのオーバーヘッドを避けるため、高速です(変数の代入とメソッド呼び出し) – Algorias

+0

いずれにせよ、それはより速いです。 –

5

さらに別の方法:

s = reduce(lambda x, y: x + y, l) 
+9

ラムダの代わりにoperator.addを使用する必要があります。最初の100000の数値を合計すると、ラムダで34ms、operator.addで19msしかありません。 (合計は15msで両方より優れています)。 – Kiv

関連する問題