2016-06-16 14 views
7

Byłem zaskoczony, że nazywając np.inner obliczyć sumę kwadratów wynosiła około 5x szybciej niż wywołanie np.sum na wstępnie obliczane tablicy kwadratów:Suma kwadratów - np.inner vs kwadratury, następnie zsumowanie

sum of squares code

Jakiekolwiek wglądy w to zachowanie? Właściwie jestem zainteresowany bardzo szybką implementacją sumy kwadratów, więc te myśli są również mile widziane.

Odpowiedz

5

Aby sprawdzić, w którym moduły np.inner i np.sum są realizowane wpisuję

>>> np.inner.__module__ 
'numpy.core.multiarray' 
>>> np.sum.__module__ 
'numpy.core.fromnumeric' 
>>> np.__file__ 
'/Users/uweschmitt/venv_so/lib/python3.5/site-packages/numpy/__init__.py' 

Jeśli sprawdzać rzeczywiste plików, można zobaczyć, że numpy.core.multiarray jest czystym moduł C natomiast numpy.core.fromnumeric najpierw wykonuje kilka kontroli i konwersji w Pythonie przed drugą funkcją Pythona, a następnie wywoływana jest czysta implementacja C dla rzeczywistego sumowania.

Podejrzewam, że ten narzut z interpretera Pythona wyjaśnia zaobserwowane różnice czasowe.

Aby udowodnić moją założenie uruchomić synchronizację z większej tablicy i uzyskać

In [8]: a = np.random.random(1000000) 
In [9]: %timeit np.inner(a, a) 
1000 loops, best of 3: 673 µs per loop 
In [10]: %timeit np.sum(a) 
1000 loops, best of 3: 584 µs per loop 

Teraz uruchom czasy są dość podobne i zmienić trochę jeśli powtarzać wypowiedzi, czasami np.sum wygrywa somtimes np.inner.

Dla dużej tablicy rzeczywiste prace np.sum odbywa się w C i stały czas narzut z interpretera Pythona jest pomijalny.

+0

To dobra obserwacja, ale zwiększenie liczby elementów w tablicy zaostrzyło problem dla mnie. Dla elementów 1M, jak masz, 'np.inner' zajęło 62,2 mikrosekundy, a' np.sum' zajęło 1,04 ms, czyli prawie 17 razy dłużej, – bcf

+0

Jakiej wersji 'numpy' używasz? Mam '1.11.0'. – rocksportrocker

+0

I: czy uruchomiłeś taktowanie wiele razy? – rocksportrocker

Powiązane problemy