Мне нужно реализовать функцию для суммирования элементов массива с переменной длиной раздела. Так,Функция накопления cython numpy
a = np.arange(10)
section_lengths = np.array([3, 2, 4])
out = accumulate(a, section_lengths)
print out
array([ 3., 7., 35.])
Я попытался реализация в cython
здесь:
https://gist.github.com/2784725
для исполнения я по сравнению с чистым numpy
решения для случая, когда section_lengths все равно:
LEN = 10000
b = np.ones(LEN, dtype=np.int) * 2000
a = np.arange(np.sum(b), dtype=np.double)
out = np.zeros(LEN, dtype=np.double)
%timeit np.sum(a.reshape(-1,2000), axis=1)
10 loops, best of 3: 25.1 ms per loop
%timeit accumulate.accumulate(a, b, out)
10 loops, best of 3: 64.6 ms per loop
у вас есть предложения по улучшению производительности?
Я реализовал несколько предложений, см обновленную версию на GitHub: https://gist.github.com/2784725/8e2aaebbaa68c67e7a0686e9c7927f2f5b6f419a, до сих пор не принимает 63ms, поэтому никакого существенного улучшение –
Возможно, это не так, но я подумал, что я бы сказал ... numpy уже имеет что-то близкое ему для * all * ufuncs. 'np.add.reduceat (a, section_lengths.cumsum())'. Его нужно немного изменить (cumsum не хватает 0 в начале, и вы получаете дополнительный фрагмент), и вы, вероятно, можете бить скорость с помощью cython, но это очень приятная функция/трюк. – seberg