この質問のバージョンは既に尋ねられていますが、私は満足のいく回答は見つかりませんでした。numpyの効率的なループ
問題:大きなnumpyベクトルがある場合、複製されるベクトル要素のインデックスを見つけます(そのバリエーションは許容誤差との比較が可能です)。
したがって、問題は〜O(N^2)とメモリの境界です(少なくとも現在のアルゴリズムの観点から)。なぜ私がPythonを試してみたとしても、同等のCコードよりも100倍以上遅いのではないかと思います。
import numpy as np
N = 10000
vect = np.arange(float(N))
vect[N/2] = 1
vect[N/4] = 1
dupl = []
print("init done")
counter = 0
for i in range(N):
for j in range(i+1, N):
if vect[i] == vect[j]:
dupl.append(j)
counter += 1
print("counter =", counter)
print(dupl)
# For simplicity, this code ignores repeated indices
# which can be trimmed later. Ref output is
# counter = 3
# [2500, 5000, 5000]
私はnumpyの反復子を使用して試みたが、彼らはさらに悪化している(〜x4-5) http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html
(上記コード)N = Iは、PythonでCで0.1秒、12秒を取得してい10,000使用np.nditerを使ってPythonで40秒、np.ndindexを使ってPythonで50秒。私はそれをN = 160,000にプッシュし、タイミングは予想どおりN^2になりました。
Pythonが遅いためですか? –
numpy配列は、組み込みのnumpy関数(C言語で実装されています)を使用すると効率的です。 Pythonループはnumpyを使うかどうかにかかわらず遅いです。 numpy関数のみを使用してアルゴリズムを実装しようとします。組み込みのPython関数や内包語を使用すると、パフォーマンスが向上するはずです(numpy未満ですが、単純なループ以上)。 – kjaquier
このように、Pythonのループは悪くありません。とにかくループするのはとても難しいです。私はそれが(この別のコンテキストを作成する)このコードを殺しているネストされたループだと思う – ink