2016-06-16 12 views
7

mi ha sorpreso che chiama np.inner per calcolare la somma dei quadrati era di circa 5 volte più veloce di chiamare np.sum su un array di pre-calcolate di quadrati:Somma dei quadrati - np.inner vs squadratura, poi sommando

sum of squares code

Qualche informazione su questo comportamento? In realtà sono interessato a un'implementazione molto veloce di una somma di quadrati, quindi anche quei pensieri sono ben accetti.

risposta

5

per sapere in quali Moduli np.inner e np.sum sono implementate digito

>>> 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' 

Se si controlla i file effettivi, si può vedere che numpy.core.multiarray è un modulo puro C mentre numpy.core.fromnumeric primo fa alcuni controlli e le conversioni in Python prima di una seconda funzione Python e poi viene chiamata una pura implementazione C per la sommatoria effettiva.

Ho il sospetto che questo sovraccarico dell'interprete Python spieghi le differenze temporali osservate.

per dimostrare la mia ipotesi corro la sincronizzazione con un array più grande e ottenere

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 

Ora gestiscono i tempi sono abbastanza simili e cambiare un po 'se si ripete il bilancio, a volte np.sum vittorie, somtimes np.inner.

Per il grande array, il lavoro effettivo di np.sum viene eseguito in C e l'overhead a tempo costante dall'interprete Python è trascurabile.

+0

È una buona osservazione, ma l'aumento del numero di elementi nell'array ha esacerbato il problema per me. Per gli elementi 1M che hai, 'np.inner' ha preso 62,2 microsecondi, mentre' np.sum' ha impiegato 1,04 ms, o quasi 17 volte di più, – bcf

+0

Quale versione di 'numpy' usi? Ho '1.11.0'. – rocksportrocker

+0

E: hai eseguito il cronometro più volte? – rocksportrocker

Problemi correlati