У меня есть несколько 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]])
И я использую следующий код, чтобы найти сумму элементов на каждой n-й диагонали от -7 до 8 доски (и ее зеркальную версию).
n = 8
rate = [b.diagonal(i).sum()
for b in (board, board[::-1])
for i in range(-n+1, n)]
После некоторого профилирования эта операция занимает около 2/3 общего времени работы, и, похоже, это связано с двумя факторами:
.диагональный
метод строит новый массив вместо представления (похоже, numpy 1.7 будет иметь новый метод .diag
для решения этой проблемы)Итак, есть ли способы быстрее найти эти суммы (возможно, на уровне C numpy)?
После еще нескольких тестов я смог сократить общее время в 7,5 раз, кэшируя эту операцию... Может быть, я искал не то узкое место?
Еще кое-что:
Только что нашел метод .trace
, который заменяет диагональ(i).sum()
и... особых улучшений не произошло в производительности (примерно от 2 до 4%).
Итак, проблема должна заключаться в понимании. Есть идеи?