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.
Niestety zastosowanie wzdłuż osi wydaje się być opcją tylko dla zadań niezwiązanych z prędkością. – Wizard