2012-06-08 12 views
25

In Python, welche ist schneller?numpy.max oder max? Welcher ist schneller?

numpy.max(), numpy.min() 

oder

max(), min() 

Meine Liste/Array-Länge variiert von 2 bis 600. Welches sollte ich einige Laufzeit verwenden zu retten?

+3

Sie sollten auf jeden Fall testen und für Ihr spezielles Szenario erfahren, aber mein erster Instinkt ist, dass es davon abhängen würde, ob Ihr Iterables ist " vanilla "python iterables oder numpy iterables. – jedwards

+6

Wenn die Daten in einer ** "Liste" ** sind, würde ich Vanille 'max' verwenden. Wenn sie in einem numply ** 'Array' ** sind, würde ich' numpy.max' verwenden. Konvertieren einer Liste in ein numpy Array ist eine ziemlich teure Operation –

Antwort

36

Nun aus meiner Timings folgt, wenn Sie bereits numpy Array a Sie a.max verwenden sollten (die Quelle sagt es das gleiche wie np.max wenn a.max verfügbar ist). Aber wenn Sie eine eingebaute Liste haben, dann dauert die meiste Zeit umwandeln es in np.darray => das ist, warum max ist besser in Ihrem Timings.

In essense: Wenn np.ndarray dann a.max, wenn list und keine Notwendigkeit für die ganze Maschinerie der np.ndarray dann Standard max.

9

Es ist wahrscheinlich am besten, wenn Sie etwas wie das Python timeit module verwenden, um es selbst zu testen. Auf diese Weise können Sie Ihre eigenen Daten in Ihrer eigenen Umgebung testen, anstatt sich auf Dritte mit verschiedenen Testdaten und Umgebungen zu verlassen, die nicht unbedingt für Sie repräsentativ sind.

+2

Ich habe versucht, dass auf einer zufälligen Liste von 600 Gleitkommazahlen. || np.max() + np.min() -> 1.093 ms || max() + min() -> 0,092 ms – Froyo

2

numpy.min und numpy.max haben etwas andere Semantik (und Call Signaturen) zu den Builtins, so sollte die Wahl nicht mit Geschwindigkeit zu tun haben. Verwenden Sie die numpy-Versionen, wenn Sie in der Lage sein müssen, mehrdimensionale Daten zu verarbeiten. Wenn Sie nur Python-Listen oder andere Dinge verwenden, die Dimensionalität nicht kennen, verwenden Sie die Builtins.

9

Ich war auch daran interessiert und testete die drei Varianten mit perfplot (ein kleines Projekt von mir). Ergebnis: Sie gehen nicht falsch mit a.max().

enter image description here

Code, um das Grundstück zu reproduzieren:

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)' 
    ) 
Verwandte Themen