ローカル クラスターで順位相関計算を行うスクリプトを作成しました。X
計算には、長さ 5000 ~ 10000 の2 つの配列を調べてY
、数量を抽出することが含まれます。
all((X[i], Y[i]))
all((X[i], not Y[i]))
all((not X[i], Y[i]))
何千回も計算します(シャッフルするためX
/Y
他のものの中で)。
私たちのクラスターの 1 つは python2.4 を実行していたので、all
s をnumpy.all
s に変更しました。しかし、私が 5 ~ 6 時間かかると見積もった計算は、24 時間以上のマークに達していました。これにより、私は調査するようになりました。
サンプルコードは次のとおりです。
In [2]: import timeit
In [3]: s = """import numpy as np
...: x, y = np.random.rand(1000), np.random.rand(1000)
...: [all((x[i], y[i])) for i in range(1000)]
...: """
In [4]: timeit.timeit(s, number=1000)
Out[4]: 0.39837288856506348
In [5]: s_numpy = """import numpy as np
...: x, y = np.random.rand(1000), np.random.rand(1000)
...: [np.all((x[i], y[i])) for i in range(1000)]
...: """
In [9]: timeit.timeit(s_numpy, number=1000)
Out[9]: 14.641073942184448
numpy.all
これを計算するのに 50 倍の時間がかかる理由は何ですか? numpy.array
オーバーヘッドですか?
編集:私の元の配列はnumpy.array
、ここにあるような s ではありません ( np.random.rand
)。行を変更する必要があるまで、私は numpy をまったく使用していませんでしたall
。ただし、ループを次のようなものに置き換えました
np.sum(np.logical_and(X, Y))
np.sum(np.logical_and(X, np.logical_not(Y)))
np.sum(np.logical_and(np.logical_not(X), Y))
これにより、初期オーバーヘッドの実行と、これらのループの約 3000 の計算が 60% 程度高速化されます。ありがとう!numpy を使用して最適化する方法をさらに探します。