[PYTHON] Wie man schneller schreibt, wenn man numpy wie deque verwendet

Was du machen willst

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.

Alternativer Kandidat

Verwenden Sie numpy.roll ()

x = np.roll(x, -1)
x[-1] = 1

Der einfachste Weg ist, es um eins wie Deque zu verschieben und es hinten zu ersetzen.

anhängen und löschen

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.

Kopieren Sie eine vor und ersetzen Sie sie am Ende

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.

Mit deque manipulieren und dann in numpy.ndarray konvertieren

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.

Verifizierungs-Schlüssel

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)

Prüfergebnis

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

Wie man schneller schreibt, wenn man numpy wie deque verwendet
Wie man Scicit-Learn wie Conda Numpy beschleunigt
Wie man Python für Anfänger schneller macht [numpy]
Wie benutzt man numpy?
So schreiben Sie eine GUI mit dem Befehl maya
Beenden bei Verwendung von Python in Terminal (Mac)
[Einführung in Python] So schreiben Sie sich wiederholende Anweisungen mit for-Anweisungen
XPath-Grundlagen (2) - So schreiben Sie XPath
[Einführung in Python] Wie man bedingte Verzweigungen mit if-Anweisungen schreibt
So lösen Sie den CSRF-Schutz bei Verwendung von AngularJS mit Django
Wie kann doi nützlich sein, wenn man fragt, wie man Code schreibt?
So installieren Sie Python mit Anaconda
Wie man nüchtern mit Pandas schreibt
So zeigen Sie Formeln in Latex an, wenn Sie sympy (> = 1.4) in Google Colaboratory verwenden
Wiederverwendung von Flaschen Wie schreibe ich HTML?
So fügen Sie sudo hinzu, wenn Sie das Debug ausführen
So schreiben Sie ein Docker-Basis-Image
Wie schreibe ich Django1.9 umweltunabhängig wsgi.py
Hinweise zum Schreiben von require.txt
Umgang mit OAuth2-Fehlern bei Verwendung von Google APIs aus Python
So schreiben Sie eine Zeichenfolge, wenn Python mehrere Zeilen enthält
Qiita (1) Wie schreibe ich einen Codenamen?
Wie man optuna einstellt (wie man einen Suchraum schreibt)
So zeichnen Sie ein Diagramm mit Matplotlib
Wie bekomme ich IP bei Tornado + Nginx
So richten Sie SVM mit Optuna ein
So schreiben Sie Python-Dokumentkommentare (Docstrings)
So installieren Sie ein Paket mithilfe eines Repositorys
So stellen Sie xg boost mit Optuna ein
Verwendung von "deque" für Python-Daten
So installieren Sie NumPy auf Raspeye
Wie schreibe ich diesen Prozess in Perl?
Wie schreibe ich Ruby to_s in Python
Zusammenfassung des Schreibens von AWS Lambda
Wie schreibe ich pydoc und mehrzeilige Kommentare
Verwendung mehrerer Argumente bei der Parallelverarbeitung mithilfe der Mehrfachverarbeitung in Python
So schreiben Sie einen Komponententest für den URL-Abruf in GAE / P.
So starten Sie Python (Flask) beim Start von EC2
Umgang mit Fehlern beim Auftreffen auf pip pip
So codieren Sie eine Drohne mithilfe der Bilderkennung
So richten Sie eine zufällige Gesamtstruktur mit Optuna ein
[Django] So beheben Sie Fehler bei der Installation von mysqlclient
So installieren Sie pip, numpy auf Autodesk MAYA
Antwort auf "Offline in Echtzeit, wie man ein F02-Problem schreibt"
Verwendung von Tweepy ~ Teil 2 ~ [Folgen, Gefällt mir usw.]
So beheben Sie, wenn der Terminaleingang abnormal wird
So erhalten Sie Artikeldaten mithilfe der Qiita-API
So schreiben Sie einen ShellScript Bash für Anweisung
Antwort auf "Offline-Echtzeit, wie man ein F01-Problem schreibt"
So richten Sie eine zufällige Gesamtstruktur mit Optuna ein
So suchen Sie HTML-Daten mit Beautiful Soup
Antwort auf "Offline-Echtzeit, wie man ein E13-Problem schreibt"
Hochladen auf ein freigegebenes Laufwerk mit pydrive
So deinstallieren Sie ein mit setup.py installiertes Modul
So schreiben Sie eine ShellScript-Bash-Case-Anweisung
Umgang mit dem Fehler "Typfehler: Keine übereinstimmende Signatur gefunden" bei Verwendung von pandas fillna