2011-12-28 8 views
7

Jestem zdezorientowany tym, że funkcja numpy o numerze numpy.apply_along_axis() przewyższa prostą pętlę w języku Python. Na przykład, rozważmy przypadek matrycy z wielu wierszy, a chcesz obliczyć sumę każdego wiersza:Dlaczego numpy.apply_along_axis wydaje się wolniejsza od pętli Pythona?

x = np.ones([100000, 3]) 
sums1 = np.array([np.sum(x[i,:]) for i in range(x.shape[0])]) 
sums2 = np.apply_along_axis(np.sum, 1, x) 

Oto jestem nawet za pomocą wbudowanego w numpy funkcji, np.sum, a jednak obliczenia sums1 (Pętla Pythona) zajmuje mniej niż 400 ms, a obliczanie sums2 (apply_along_axis) zajmuje ponad 2000 ms (NumPy 1.6.1 w systemie Windows). Przez dalszą drogę porównania, funkcja R's rowMeans często może to zrobić w czasie krótszym niż 20 ms (jestem prawie pewien, że wywołuje kod C), podczas gdy podobna funkcja R apply() może to zrobić w około 600 ms.

+0

Niestety zastosowanie wzdłuż osi wydaje się być opcją tylko dla zadań niezwiązanych z prędkością. – Wizard

Odpowiedz

10

np.sum brać parametr axis, więc można obliczyć sumę po prostu korzystając

sums3 = np.sum(x, axis=1) 

Jest to o wiele szybciej niż na 2 sposoby ty stawianych.

$ python -m timeit -n 1 -r 1 -s "import numpy as np;x=np.ones([100000,3])" "np.apply_along_axis(np.sum, 1, x)" 
1 loops, best of 1: 3.21 sec per loop 

$ python -m timeit -n 1 -r 1 -s "import numpy as np;x=np.ones([100000,3])" "np.array([np.sum(x[i,:]) for i in range(x.shape[0])])" 
1 loops, best of 1: 712 msec per loop 

$ python -m timeit -n 1 -r 1 -s "import numpy as np;x=np.ones([100000,3])" "np.sum(x, axis=1)" 
1 loops, best of 1: 1.81 msec per loop 

(Jak, dlaczego apply_along_axis jest wolniejszy. - Nie wiem, prawdopodobnie dlatego, że funkcja jest napisany w czystym Pythonie i jest o wiele bardziej ogólne, a więc mniej niż okazja optymalizacja wersji tablicy)

Powiązane problemy