Анализируя ответ Махди, я пришел к выводу, что большую часть времени проводил, занимаясь np.roll()
. Убрав необходимость в броске и все еще используя numpy, я сократил время выполнения до 4-5 мксек на цикл по сравнению с 41 мкс Махди (для сравнения, функция Махди в среднем занимала 37 мкс на моей машине).
def polygon_area(x,y):
correction = x[-1] * y[0] - y[-1]* x[0]
main_area = np.dot(x[:-1], y[1:]) - np.dot(y[:-1], x[1:])
return 0.5*np.abs(main_area + correction)
При вычислении корректирующего члена, а затем нарезке массивов, нет необходимости свернуть или создать новый массив.
Тесты:
10000 iterations
PolyArea(x,y): 37.075µs per loop
polygon_area(x,y): 4.665µs per loop
Время было сделано с использованием модуля time
и time.clock()
Я не думаю, что вы действительно что-то упускаете. Однако вы можете делать ненужную работу. В этом случае у вас есть два указателя на фиксацию «больше работы», и вы просите git-svn переместить один из них. Другой все еще остается на своем месте.
На самом деле вам не нужна ветвь master
. Git-svn не заботится о том, какую ветку вы фиксируете. IIRC, он использует первый svn-remote, который может найти среди предков текущего коммита.
Я предлагаю другую версию рабочего процесса:
git checkout -b story-xyz remotes/trunk
git commit -a -m "work"
git commit -a -m "more work"
git svn fetch
git rebase remotes/trunk (with -i, perhaps)
git svn dcommit
Это должно дать вам дерево без дополнительной ветви. Тем не менее, вы должны быть осторожны с слияниями с перемоткой вперед.