у меня есть некоторые board
Numpy массивов как то:Найти диагонали суммы в 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 = 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
решить, что) - итерация сделано в питон внутри списка понимания
Итак, есть ли способы найти эти суммы быстрее (возможно, в слое C numpy)?
После еще нескольких испытаний, я мог бы уменьшить 7.5x общего времени за счет кэширования этой операции ... Может быть, я искал неправильное узкое место? более
одно:
Просто нашли .trace
метод, который заменяет diagonal(i).sum()
вещи и ... Там не было много улучшений в производительности (примерно от 2 до 4%).
Таким образом, проблема должна заключаться в понимании. Есть идеи?
Кэширование - это правильный путь к вашей проблеме. Но для реального узкого места, я думаю, это язык python. Если вам действительно нужна более высокая производительность для этой операции, вам нужно C. – Mayli
@Mayli Caching решил часть проблемы. Профилирование все еще говорит, что это самый дорогой расчет ... – JBernardo
Переписать точку доступа в C всегда будет приносить некоторую производительность, не так ли? – Mayli