Quoi utiliser pour les piles et les files d'attente Python (comparaison de vitesse de chaque structure de données)

introduction

Cet article concerne principalement la programmation compétitive.

Il existe plusieurs façons d'implémenter des piles et des files d'attente en Python.

--Empiler --Utiliser la liste (ʻappend () , pop () ) --Utiliser collections.deque (ʻappend () ,pop ()) --Queue --Utiliser la liste (ʻappend () , pop (0) ) --Utiliser collections.deque (ʻappend () ,popleft ()) --Utilisez queue.Queue (put (), get ())

Au fait, laquelle de ces options est la meilleure à utiliser? Cette fois, nous allons nous concentrer sur l'aspect vitesse.

Méthode de mesure

Ajoutez et récupérez des éléments 10 fois, 100 fois, 1000 fois, 10000 fois et 100000 fois pour chaque structure de données.

Tout le code omet la partie d'importation ci-dessous.

importer une partie


from collections import deque
from queue import Queue
import time

empiler

utiliser la liste


# stack(list)
stack_list_append = []
stack_list_pop = []
for i in range(1, 6):
    start = time.time()

    stack_list = []
    for j in range(10 ** i):
        stack_list.append(j)

    stack_list_append.append(time.time() - start)

    start = time.time()

    for j in range(10 ** i):
        stack_list.pop()

    stack_list_pop.append(time.time() - start)

Utiliser deque


# stack(deque)
stack_deque_append = []
stack_deque_pop = []
for i in range(1, 6):
    start = time.time()

    stack_deque = deque([])
    for j in range(10 ** i):
        stack_deque.append(j)

    stack_deque_append.append(time.time() - start)

    start = time.time()

    for j in range(10 ** i):
        stack_deque.pop()

    stack_deque_pop.append(time.time() - start)

queue

utiliser la liste


# queue(list)
queue_list_append = []
queue_list_pop = []
for i in range(1, 6):
    start = time.time()

    queue_list = []
    for j in range(10 ** i):
        queue_list.append(j)

    queue_list_append.append(time.time() - start)

    start = time.time()

    for j in range(10 ** i):
        queue_list.pop(0)

    queue_list_pop.append(time.time() - start)

Utiliser deque


# queue(deque)
queue_deque_append = []
queue_deque_pop = []
for i in range(1, 6):
    start = time.time()

    queue_deque = deque([])
    for j in range(10 ** i):
        queue_deque.append(j)

    queue_deque_append.append(time.time() - start)

    start = time.time()

    for j in range(10 ** i):
        queue_deque.popleft()

    queue_deque_pop.append(time.time() - start)

Utiliser la file d'attente


# queue(Queue)
queue_Queue_append = []
queue_Queue_pop = []

for i in range(1, 6):
    start = time.time()

    queue_Queue = Queue()
    for j in range(10 ** i):
        queue_Queue.put(j)

    queue_Queue_append.append(time.time() - start)

    start = time.time()

    for j in range(10 ** i):
        queue_Queue.get()

    queue_Queue_pop.append(time.time() - start)

Résultat de la mesure

Lorsque le résultat de la mesure est représenté graphiquement, c'est comme suit.

スクリーンショット 2020-03-01 16.35.38.png

Commençons par le coin supérieur gauche.

Résultat de la pile

Ajouter un élément

Le graphique en haut à gauche. スクリーンショット 2020-03-01 16.39.29.png Deque est un peu plus rapide, mais c'est à peu près la même chose.

Extraction d'éléments

C'est un graphique en haut à droite. スクリーンショット 2020-03-01 16.40.06.png Encore une fois, deque est un peu plus rapide, mais c'est à peu près la même chose.

Résultat de la file d'attente

Ajouter un élément

C'est un graphique en bas à gauche. スクリーンショット 2020-03-01 16.40.40.png Avec un grand nombre d'éléments, la file d'attente est plus de 10 fois plus lente que les autres.

Extraction d'éléments

Le graphique en bas à droite. スクリーンショット 2020-03-01 16.40.48.png La file d'attente revient à ajouter un élément, mais la liste est évidemment mauvaise. Il est plus de 100 fois plus lent que le deque le plus rapide.

Conclusion

Il est préférable d'utiliser collections.deque pour les piles et les files d'attente.

Puisque c'est un gros problème, j'écrirai une utilisation simple.

empiler

from collections import deque

s = deque([])
s.append(1)  # [1]
s.append(2)  # [1, 2]
s.append(3)  # [1, 2, 3]
s.pop()      #Retirer du haut[1, 2, 3] -> [1, 2]
s.pop()      # [1, 2] -> [1]
s.pop()      # [1] -> []

queue

Dans la pile, c'était pop quand il a été supprimé, mais dans la file d'attente, c'est juste popleft.

from collections import deque

q = deque([])
q.append(1)  # [1]
q.append(2)  # [1, 2]
q.append(3)  # [1, 2, 3]
q.popleft()  #Retirer du bas[1, 2, 3] -> [2, 3]
q.popleft()  # [2, 3] -> [3]
q.popleft()  # [3] -> []

Recommended Posts

Quoi utiliser pour les piles et les files d'attente Python (comparaison de vitesse de chaque structure de données)
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment utiliser "deque" pour les données Python
Liste des bibliothèques Python pour les data scientists et les data ingénieurs
Vitesse de lecture Python netCDF4 et imbrication d'instructions for
[Introduction à Azure pour les utilisateurs de kaggle] Comparaison du démarrage et de l'utilisation de la machine virtuelle Azure Notebooks et Azure Notebooks
[Python] Comment définir des noms de variables dynamiquement et comparer la vitesse
Application de Python: Nettoyage des données Partie 3: Utilisation d'OpenCV et prétraitement des données d'image
[Python] Résumé de l'utilisation des fonctions de fractionnement et de jointure
[Introduction to Data Scientists] Bases de Python ♬ Fonctions et classes
traitement pour utiliser les données notMNIST en Python (et essayé de les classer)
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
Je souhaite utiliser à la fois la clé et la valeur de l'itérateur Python
Comparaison de la vitesse de la perspective XML Python
[Introduction to Data Scientists] Bases de Python ♬ Branchements conditionnels et boucles
[Introduction aux Data Scientists] Bases de Python ♬ Fonctions et fonctions anonymes, etc.
[Python of Hikari-] Chapitre 05-09 Syntaxe de contrôle (utilisation correcte des instructions for et while)
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
[Python] Résumé de l'utilisation des pandas
Comment installer et utiliser pandas_datareader [Python]
Structure de données Python et implémentation interne ~ Liste ~
[Python] Organisation de l'utilisation des instructions
Structure et fonctionnement des données Python (mémo d'apprentissage Python ③)
[Python2.7] Résumé de l'utilisation d'unittest
python: Comment utiliser les locals () et globals ()
Comment utiliser le zip Python et énumérer
Compressez les données python et écrivez sur sqlite
Résumé de l'utilisation de la liste Python
[Python2.7] Résumé de l'utilisation du sous-processus
Comment utiliser is et == en Python
[Introduction au Data Scientist] Bases de Python ♬
Comparaison de vitesse de murmurhash3, md5 et sha1
[Question] Comment utiliser plot_surface de python
Pour accélérer python, résumez la quantité de calcul du type de collection (liste / tuple / dictionnaire / ensemble) pour chaque objectif.
[Python] De l'analyse morphologique des données CSV à la sortie CSV et à l'affichage graphique [GiNZA]
Analyse des données en Python Résumé des sources que les débutants devraient d'abord consulter
OpenGoddard Comment utiliser la bibliothèque 2-python pour un contrôle optimal non linéaire et la génération de trajectoires
Conseils pour ceux qui ne savent pas comment utiliser is et == en Python
Comment utiliser la bibliothèque OpenGoddard 3-python pour un contrôle optimal non linéaire et la génération de trajectoires
Comment utiliser la bibliothèque OpenGoddard 4-python pour un contrôle optimal non linéaire et la génération de trajectoires
Comment utiliser OAuth et API de compte de service avec le client API Google pour python
Organiser les outils Python pour accélérer le mouvement initial des compétitions d'analyse de données
Comment utiliser la bibliothèque OpenGoddard 1-python pour un contrôle optimal non linéaire et la génération de trajectoires
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
[Python] Comment utiliser deux types de type ()
[Introduction aux statistiques] Quel type de distribution est la distribution t, la distribution chi carré et la distribution F? Un petit résumé de l'utilisation de [python]
[Python3] Comparaison de vitesse, etc. sur la privation de numpy.ndarray
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
Utiliser des décorateurs pour empêcher la ré-exécution du traitement des données
Résumé de l'utilisation de MNIST avec Python
Comment utiliser les outils d'analyse de données pour les débutants
Comparez la vitesse d'ajout et de carte Python
environnement de développement python -utilisation de pyenv et virtualenv-
[Python] Comment utiliser la fonction de hachage et taple.
Vitesse: ajouter un élément à la fin du tableau Python
Résumé de l'étude de Python pour utiliser AWS Lambda
Comparaison d'écriture R et Python (méthode de division mutuelle euclidienne)
Liste de code Python à déplacer et à mémoriser
Nettoyage des données 3 Utilisation d'OpenCV et prétraitement des données d'image
Comparaison de Python et Ruby (Environment / Grammar / Literal Edition)