Wenn Sie mit numpy.ndarray so etwas wie deque ausführen möchten, ist es schneller, einfach np.append (x, y) und np.delete (x, 0) zu verwenden, oder Sie sollten deque und dann ndarray verwenden. Ich werde das überprüfen.
Verdächtiger Code, der zu spät zu sein scheint
x = np.append(x, 1)
x = np.delete(x, 0)
Ich habe es am Ende hinzugefügt und den Anfang gelöscht.
numpy scheint beim Erstellen eines Arrays einen Bereich fester Länge zu sichern, daher scheint das Ändern der Länge etwas langsam zu sein.
Bei dieser Überprüfung scheint es sich um FIFO [First-In First-Out / First-In First-Out] zu handeln, es wird jedoch davon ausgegangen, dass das Ganze gelesen wird, ohne den Anfang zu lesen. Mit anderen Worten, es ist eine Überprüfung, wenn es wie ein Puffer verwendet wird.
Dieses Mal möchte ich jedes Mal, wenn ich es hinzufüge, numpy.mean () und numpy.std () verwenden, daher habe ich die Bedingungen so begrenzt, dass es am Ende numpy.ndarray ist. Wenn Sie nur ein Array erstellen möchten, ist es schneller, deque so wie es ist zu verwenden, aber dann können Sie nicht den Mittelwert () und den std () von numpy verwenden, wie er ist.
Dieses Mal möchte ich unter der Annahme, dass die Numpy-Funktion für jede Schleife verwendet wird, die Konvertierungskosten einschließlich der Konvertierungskosten vergleichen.
x = np.roll(x, -1)
x[-1] = 1
Der einfachste Weg ist, es um eins wie Deque zu verschieben und es hinten zu ersetzen.
x = np.append(x, 1)
x = np.delete(x, 0)
Genau das, was Sie tun möchten. Dies scheint zu spät zu sein, also überprüfe ich diesmal.
x[0:-1] = x[1:]
x[-1] = 1
Das Schneiden scheint schnell zu sein, es sieht also so aus, als würde es etwas Ähnliches wie Rollen tun, aber es ist subtil anders.
d.append(1)
x = np.array(d)
Wobei d die durch d = deque (maxlen) erzeugte Deque ist. Wenn maxlen angegeben ist, verschwindet der Anfang ohne Erlaubnis. Deque ist überwältigend schnell, wenn Sie einfach anhängen, aber diesmal müssen Sie es jedes Mal in numpy.array konvertieren.
Dann ist die Überprüfung die schnellste. Klicken Sie hier, um den zur Überprüfung verwendeten Code anzuzeigen
import time
import numpy as np
from collections import deque
xlen = 1000
n = 100000
x = np.zeros(xlen)
s = time.time()
for i in range(n):
x = np.roll(x, -1)
x[-1] = 1
print(time.time() - s)
s = time.time()
for i in range(n):
x = np.append(x, 1)
x = np.delete(x, 0)
print(time.time() - s)
s = time.time()
for i in range(n):
x[0:-1] = x[1:]
x[-1] = 1
print(time.time() - s)
#Deklaration und Initialisierung von deque
d = deque(maxlen=xlen)
for i in range(xlen):
d.append(1)
s = time.time()
for i in range(n):
d.append(1)
x = np.array(d)
print(time.time() - s)
Ich habe es mit Python3.8 ausgeführt.
Methode | xlen=Im Fall von 100 | xlen=Im Fall von 10000 |
---|---|---|
numpy.roll()verwenden | 2.58s | 3.28s |
anhängen und löschen | 1.79s | 2.78s |
Kopieren Sie eine vor und ersetzen Sie sie am Ende | 0.100s | 0.366s |
Mit deque manipulieren und dann numpy.In ndarray konvertieren | 1.52s | 88.0s |
Das schnellste Ergebnis war ** Kopieren in Scheiben und Zuweisen am Ende **. Es ist auch unwahrscheinlich, dass der angebliche Code die falsche Wahl ist. Deque kann auch gut sein, weil np.array () nicht so langsam ist, wenn das Array kurz ist. Wenn es länger wird, wird es für np.array () enorm viel Zeit in Anspruch nehmen, was gefährlich ist.
Ich hoffe es wird für Sie hilfreich sein.
Recommended Posts