2012-06-08 9 views
25

In python, quale è più veloce?numpy.max o max? Qual è più veloce?

numpy.max(), numpy.min() 

o

max(), min() 

Mia lista/lunghezza della matrice varia da 2 a 600. Quale dovrei usare per risparmiare un po 'di tempo di esecuzione?

+3

Si dovrebbe prova e scoprire per lo scenario specifico, ma il mio primo istinto è che sarebbe dipenderà dal fatto che i tuoi iterabili sono " vanilla "iterables python o iterables numpy. – jedwards

+6

Se i dati sono in un '' elenco' **, userei vanilla 'max'. Se sono in un numpy ** 'array' ** userei' numpy.max'. Convertire una lista in una matrice numpy è un'operazione piuttosto costosa. –

risposta

36

Beh dai miei tempi ne consegue se si dispone già di serie NumPy a si dovrebbe usare a.max (la fonte dice che è lo stesso come se np.maxa.max disponibili). Ma se hai una lista integrata allora la maggior parte delle volte richiede convertendo in np.ndarray => ecco perché max è meglio nei tuoi tempi.

In essenza: se np.ndarray poi a.max, se list e senza bisogno di tutti i macchinari di np.ndarray quindi normale max.

9

Probabilmente è meglio se si utilizza qualcosa come il Python timeit module per testarlo da solo. In questo modo puoi testare i tuoi dati nel tuo ambiente, piuttosto che affidarti a terze parti con vari dati di test e ambienti che non sono necessariamente rappresentativi dei tuoi.

+2

L'ho provato su una lista casuale di 600 numeri in virgola mobile. || np.max() + np.min() -> 1.093 msec || max() + min() -> 0,092 msec – Froyo

2

numpy.min e numpy.max hanno semantica leggermente diversa (e le firme di chiamata) per i builtin, quindi la scelta non deve essere a che fare con la velocità. Utilizzare le versioni di numpy se è necessario essere in grado di gestire i dati multidimensionali in modo corretto. Se stai usando solo elenchi Python o altre cose che non conoscono la dimensionalità, usa i builtin.

9

Mi interessava anche questo e ho provato le tre varianti con perfplot (un mio piccolo progetto). Risultato: non stai sbagliando con a.max().

enter image description here

codice per riprodurre la trama:

import numpy 
import perfplot 

perfplot.show(
    setup=lambda n: numpy.random.rand(n), 
    kernels=[ 
     max, 
     numpy.max, 
     lambda a: a.max() 
     ], 
    labels=['max(a)', 'numpy.max(a)', 'a.max()'], 
    n_range=[2**k for k in range(20)], 
    logx=True, 
    logy=True, 
    xlabel='len(a)' 
    )