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.
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
Jakiej wersji 'numpy' używasz? Mam '1.11.0'. – rocksportrocker
I: czy uruchomiłeś taktowanie wiele razy? – rocksportrocker