[PYTHON] np.mean und np.average speed showdown

Es gibt zwei Möglichkeiten, mit NumPy zu mitteln: np.mean und np.average (obwohl es möglicherweise andere gibt). Lassen wir hier den Unterschied zwischen den beiden anderen Artikeln und sehen, welcher in Bezug auf die Verarbeitungsgeschwindigkeit besser ist. Der folgende Code bezieht sich auf diese Site.

Ausführungsumgebung

CentOS Linux release 7.6.1810 (Core) Python 3.8.5

Ausführungscode 1

Berechnen Sie zunächst einfach das eindimensionale Array.

test1.py


import timeit
import numpy as np

def func_average(n):
    return np.average(np.arange(n**2))

def func_mean(n):
    return np.mean(np.arange(n**2))

n = 1000
loop = 1000

result_average = timeit.timeit(lambda: func_average(n), number=loop)
result_mean = timeit.timeit(lambda: func_mean(n), number=loop)

print('average: ', result_average / loop)
print('mean:    ', result_mean / loop)

Ausführungsergebnis

average:  0.0015093836802989244
mean:     0.001964871450792998

Darüber hinaus habe ich viermal gemessen, aber in jedem Fall war "np.average" etwa 20 bis 30% schneller.

Ausführungscode 2

Nehmen Sie als nächstes den Durchschnitt des zweidimensionalen Arrays.

test.py


import timeit
import numpy as np

def func_average(n):
    return np.average(np.arange(n**2).reshape(n, n))

def func_mean(n):
    return np.mean(np.arange(n**2).reshape(n, n))

n = 1000
loop = 1000

result_average = timeit.timeit(lambda: func_average(n), number=loop)
result_mean = timeit.timeit(lambda: func_mean(n), number=loop)

print('average: ', result_average / loop)
print('mean:    ', result_mean / loop)

Ausführungsergebnis

average:  0.0016613604403100909
mean:     0.002270303561817855

Selbst in diesem Fall war "np.average" schnell.

Erwägung

Ich habe andere ähnliche Bedingungen ausprobiert, aber das Ergebnis war, dass "np.average" schneller war. Dies bedeutet nicht "np.mean" ... Ich dachte, das sei nicht der Fall, und als ich weiter suchte, fand ich einen solchen Thread. Übersetzt, modifiziert und zitiert unten:

(Weggelassen) Es sind andere Unterschiede zwischen "Durchschnitt" und "Mittelwert" zu berücksichtigen (andere Unterschiede wurden im vorherigen Thread erwähnt). "Durchschnitt" nimmt den Durchschnitt aller Werte im Array ohne Berücksichtigung der Maske, während "Mittelwert" die Maske nimmt, so dass der Durchschnitt nur mit den nicht maskierten Werten genommen wird.

g = [1,2,3,55,66,77] 
f = np.ma.masked_greater(g,5) 
np.average(f) 
Out: 34.0 
np.mean(f) 
Out: 2.0

In der Tat scheint es, dass "Mittelwert" verwendet werden sollte, wenn es sich um Arrays handelt, die fehlende Werte enthalten.

Fazit

Es ist am besten, es entsprechend dem Zweck richtig zu verwenden, aber angesichts der Zeit, die für das gesamte Programm benötigt wird, halte ich das Verhältnis von "Durchschnitt" und "Mittelwert" zu unbedeutend, so dass die Option, "Mittelwert" zu verwenden, ohne über irgendetwas nachzudenken Ist es nicht eine Ameise?

Recommended Posts

np.mean und np.average speed showdown
Geschwindigkeitsvergleich zwischen CPython und PyPy