Rozważ następujące dwie funkcje, które zasadniczo mnożą każdą liczbę w małej sekwencji z każdą liczbą w większej sekwencji, aby zbudować tablicę 2D, a następnie podwajają wszystkie wartości w tablica. noloop()
używa bezpośredniego mnożenia tablic 2D numpy i zwraca wynik, podczas gdy loop()
używa pętli for do iteracji ponad arr1
i stopniowo buduje tablicę wyjściową.Dlaczego pętle są szybsze niż numpy dla mnożenia macierzy dwuwymiarowych
import numpy as np
arr1 = np.random.rand(100, 1)
arr2 = np.random.rand(1, 100000)
def noloop():
return (arr1*arr2)*2
def loop():
out = np.empty((arr1.size, arr2.size))
for i in range(arr1.size):
tmp = (arr1[i]*arr2)*2
out[i] = tmp.reshape(tmp.size)
return out
Spodziewałem noloop
się znacznie szybciej, nawet dla niewielkiej liczby iteracji, ale tablica o rozmiarach powyżej loop
jest rzeczywiście szybciej:
>>> %timeit noloop()
10 loops, best of 3: 64.7 ms per loop
>>> %timeit loop()
10 loops, best of 3: 41.6 ms per loop
I co ciekawe, jeśli usunąć *2
zarówno tam
>>> %timeit noloop()
10 loops, best of 3: 29.4 ms per loop
>>> %timeit loop()
10 loops, best of 3: 34.4 ms per loop
jest dobrym wytłumaczeniem th: funkcje, noloop
jest szybsza, ale tylko nieznacznie ese wyniki i czy istnieje znacznie szybszy sposób na wykonanie tego samego zadania?
uzyskać 'noloop()' jest szybszy (o ~ 15%) niż 'pętli()' niezależnie ... –
ja również uzyskać na odwrotnej zarówno python2, jak i python3. –
"Pętla" jest szybsza, jak sugeruje OP (o 28% w moim komputerze). Python 3.4.1 | Anaconda 2.1.0, IPython 2.2.0 – Roberto