私はそのboard
ようないくつかのnumpy配列を持っています:
array([[0, 0, 0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 1],
[0, 1, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 1, 0],
[1, 0, 0, 0, 0, 1, 0, 0]])
そして、次のコードを使用して、ボードの -7 から 8 までの n 番目の対角線 (およびそのミラー バージョン) の要素の合計を見つけます。
n = 8
rate = [b.diagonal(i).sum()
for b in (board, board[::-1])
for i in range(-n+1, n)]
いくつかのプロファイリングの後、この操作は全体の実行時間の約 2/3 を占めています。これは次の 2 つの要因によるものと思われます。
- この
.diagonal
メソッドは、ビューの代わりに新しい配列を作成します (numpy 1.7 には.diag
それを解決する新しいメソッドがあるようです) - 反復は、リスト内包表記内の python で行われます
それで、これらの合計をより速く見つける方法はありますか(おそらくnumpyのCレイヤーで)?
さらにいくつかのテストを行った後、この操作をキャッシュすることで合計時間を 7.5 倍短縮できました... 間違ったボトルネックを探していたのでしょうか?
もう一つ:
.trace
物を置き換える方法を見つけたところdiagonal(i).sum()
...パフォーマンスはあまり改善されませんでした(約2〜4%)。
したがって、問題は理解力であるべきです。何か案は?