[PYTHON] Comment écrire plus rapidement en utilisant numpy comme deque

Chose que tu veux faire

Si vous voulez faire quelque chose comme deque avec numpy.ndarray, est-il plus rapide d'utiliser simplement np.append (x, y) et np.delete (x, 0), ou vous devriez utiliser deque puis ndarray. Je vais vérifier cela.

Code suspect qui semble être en retard


x = np.append(x, 1)
x = np.delete(x, 0)

Je l'ai ajouté à la fin et supprimé le début.

numpy semble sécuriser une zone de longueur fixe lors de la création d'un tableau, donc changer la longueur semble être un peu lent.

Cette vérification semble concerner le FIFO [First-In First-Out / First-In First-Out], mais on suppose que l'ensemble est lu sans lire le début. En d'autres termes, il s'agit d'une vérification lorsqu'elle est utilisée comme un tampon.

Cette fois, je veux utiliser numpy.mean () et numpy.std () chaque fois que je l'ajoute, j'ai donc limité les conditions pour que ce soit numpy.ndarray à la fin. Si vous souhaitez simplement créer un tableau, il est plus rapide d'utiliser deque tel quel, mais vous ne pouvez pas utiliser la moyenne de numpy () et std () tel quel.

Cette fois, en supposant que la fonction numpy est utilisée pour chaque boucle, je voudrais comparer le coût de conversion, y compris le coût de conversion.

Candidat alternatif

Utilisez numpy.roll ()

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

Le moyen le plus simple est de le déplacer par un comme deque et de le remplacer à l'arrière.

ajouter et supprimer

x = np.append(x, 1)
x = np.delete(x, 0)

Exactement ce que tu veux faire. Cela semble être tard, donc je vérifie cette fois.

Copiez-en un avant et remplacez-le à la fin

x[0:-1] = x[1:]
x[-1] = 1

Le tranchage semble être rapide, il semble donc que cela fasse quelque chose de similaire à rouler, mais c'est subtilement différent.

Manipulez avec deque puis convertissez en numpy.ndarray

d.append(1)
x = np.array(d)

Où d est le deque généré par d = deque (maxlen). Si maxlen est spécifié, le début disparaîtra sans autorisation. Deque est extrêmement rapide si vous ajoutez simplement, mais cette fois, vous devez le convertir en numpy.array à chaque fois.

code de vérification

Ensuite, c'est la vérification qui est la plus rapide. Cliquez ici pour le code utilisé pour la vérification

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)

#Déclaration et initialisation de 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)

résultat de l'inspection

Je l'ai exécuté avec python3.8.

Méthode xlen=Dans le cas de 100 xlen=Dans le cas de 10000
numpy.roll()utilisation 2.58s 3.28s
ajouter et supprimer 1.79s 2.78s
Copiez-en un avant et remplacez-le à la fin 0.100s 0.366s
Manipuler avec deque puis numpy.Convertir en ndarray 1.52s 88.0s

Le résultat le plus rapide était ** la copie par tranches et l'attribution à la fin **. Il est également peu probable que le code présumé soit le mauvais choix. Deque peut également être bon car np.array () n'est pas si lent lorsque le tableau est court. S'il s'allonge, cela prendra énormément de temps pour np.array (), ce qui est dangereux.

J'espère que cela vous sera utile.

Recommended Posts

Comment écrire plus rapidement en utilisant numpy comme deque
Comment accélérer Scicit-Learn comme Conda Numpy
Comment rendre le Python des débutants plus rapide [numpy]
Comment utiliser numpy
Comment écrire une interface graphique à l'aide de la commande maya
Comment quitter lors de l'utilisation de Python dans Terminal (Mac)
[Introduction à Python] Comment écrire des instructions répétitives à l'aide d'instructions for
XPath Basics (2) - Comment écrire XPath
[Introduction à Python] Comment écrire des branches conditionnelles en utilisant des instructions if
Comment résoudre la protection CSRF lors de l'utilisation d'AngularJS avec Django
Comment doi peut-il être utile lorsque vous demandez comment écrire du code?
Comment installer Python à l'aide d'Anaconda
Comment écrire sobrement avec des pandas
Comment afficher des formules en latex lors de l'utilisation de Sympy (> = 1.4) dans Google Colaboratory
Réutilisation du flacon Comment écrire du HTML
Comment ajouter sudo lors de l'exécution du débogage
Comment écrire une image de base Docker
Comment écrire un fichier wsgi.py indépendant de l'environnement Django1.9
Remarques sur la rédaction de requirements.txt
Comment gérer l'erreur OAuth2 lors de l'utilisation des API Google à partir de Python
Comment écrire une chaîne de caractères lorsqu'il y a plusieurs lignes en python
Qiita (1) Comment écrire un nom de code
Comment définir optuna (comment écrire un espace de recherche)
Comment dessiner un graphique avec Matplotlib
Comment obtenir une adresse IP lorsque Tornado + nginx
Comment configurer SVM à l'aide d'Optuna
Comment écrire des commentaires de document Python (Docstrings)
Comment installer un package à l'aide d'un référentiel
Comment configurer XG Boost à l'aide d'Optuna
Comment utiliser "deque" pour les données Python
Comment installer NumPy sur Raspeye
Comment écrire ce processus en Perl?
Comment écrire Ruby to_s en Python
Résumé de l'écriture d'AWS Lambda
Comment écrire des commentaires pydoc et multi-lignes
Comment prendre plusieurs arguments lors d'un traitement parallèle à l'aide du multitraitement en python
Comment écrire un test unitaire pour l'extraction d'URL dans GAE / P
Comment démarrer Python (Flask) au démarrage d'EC2
Comment gérer les erreurs en frappant pip ②
Comment coder un drone en utilisant la reconnaissance d'image
Comment configurer une forêt aléatoire à l'aide d'Optuna
[Django] Comment résoudre les erreurs lors de l'installation de mysqlclient
Comment installer pip, numpy sur Autodesk MAYA
Réponse à "Comment écrire le problème F02 en temps réel hors ligne"
Comment utiliser Tweepy ~ Partie 2 ~ [Suivez, aimez, etc.]
Comment réparer lorsque l'entrée du terminal devient anormale
Comment obtenir des données d'article à l'aide de l'API Qiita
Comment écrire une instruction ShellScript Bash for
Réponse à "Comment écrire un problème F01 en temps réel hors ligne"
Comment configurer une forêt aléatoire à l'aide d'Optuna
Comment rechercher des données HTML à l'aide de Beautiful Soup
Réponse au "Problème d'écriture en temps réel hors ligne E13"
Comment mettre en ligne sur un Drive partagé à l'aide de pydrive
Comment désinstaller un module installé à l'aide de setup.py
Comment écrire une instruction de cas bash ShellScript
Comment traiter l'erreur "Erreur de type: Aucune signature correspondante trouvée" lors de l'utilisation de pandas fillna