[PYTHON] Hériter de la bibliothèque standard pour trouver la valeur moyenne de Queue

introduction

J'avais l'habitude de vouloir trouver la moyenne des valeurs de file d'attente (je ne me souviens pas pourquoi j'en avais besoin). À ce moment-là, j'ai utilisé le code suivant pour trouver la valeur moyenne.

queue_test.py


import queue


def queue_ave(q):
    queue_list = []
    while not q.empty():
        queue_list.append(q.get())
    for value in queue_list:  #inversé pour la pile(queue_list)changer en
        q.put(value)
    return sum(queue_list) / len(queue_list)


#Contrôle de fonctionnement
q = queue.Queue()
q.put(1)
q.put(2)
q.put(6)
q.put(8)
print(queue_ave(q))  # 4.25

Le flux de ce code (fonction) est

  1. Retirez tout de la file d'attente et placez-le dans une liste
  2. Inversement, retour de liste à file d'attente
  3. Transmettez la valeur moyenne de List comme valeur de retour

C'est quelque chose comme. Certes, la valeur moyenne de Queue peut encore être calculée. Cependant, bien sûr, il est inefficace car il coûte cher à calculer car il répète mettre et obtenir en vain.

Hériter de la bibliothèque standard

Par conséquent, une autre approche consiste à hériter de la classe Queue de la file d'attente de bibliothèque standard et à créer une classe personnalisée.

Pour ce faire, vérifiez comment la classe Queue gère les valeurs. Je pense que cela dépend de l'éditeur, mais vous pouvez voir le code source en "Ctrl + clic" la classe que vous souhaitez vérifier.

queue.py


class Queue:
    '''Create a queue object with a given maximum size.

    If maxsize is <= 0, the queue size is infinite.
    '''

    #~ Omis ~

    def put(self, item, block=True, timeout=None):
        '''Put an item into the queue.

        If optional args 'block' is true and 'timeout' is None (the default),
        block if necessary until a free slot is available. If 'timeout' is
        a non-negative number, it blocks at most 'timeout' seconds and raises
        the Full exception if no free slot was available within that time.
        Otherwise ('block' is false), put an item on the queue if a free slot
        is immediately available, else raise the Full exception ('timeout'
        is ignored in that case).
        '''
        with self.not_full:
            if self.maxsize > 0:
                if not block:
                    if self._qsize() >= self.maxsize:
                        raise Full
                elif timeout is None:
                    while self._qsize() >= self.maxsize:
                        self.not_full.wait()
                elif timeout < 0:
                    raise ValueError("'timeout' must be a non-negative number")
                else:
                    endtime = time() + timeout
                    while self._qsize() >= self.maxsize:
                        remaining = endtime - time()
                        if remaining <= 0.0:
                            raise Full
                        self.not_full.wait(remaining)
            self._put(item)
            self.unfinished_tasks += 1
            self.not_empty.notify()

En regardant la méthode put, elle dit diverses choses, mais il semble que la méthode \ _put soit utilisée pour stocker la valeur. Regardons maintenant la méthode \ _put et ainsi de suite.

queue.py


from collections import deque


class Queue:
    #~ Omis ~

    # Put a new item in the queue
    def _put(self, item):
        self.queue.append(item)

    # Initialize the queue representation
    def _init(self, maxsize):
        self.queue = deque()

De la méthode \ _put, j'ai trouvé que la valeur est stockée dans self.queue. De plus, la méthode \ _init utilisée lors de l'initialisation montre que self.queue est une instance deque.

En d'autres termes, il semble que la classe Queue utilise la classe deque des collections pour gérer les valeurs. Je n'entrerai pas dans cela ici, mais la classe deque semble être traitée comme un tableau (probablement).

Avec ces choses à l'esprit, héritez de la classe Queue et personnalisez-la à votre guise.

queue_test.py


import queue


class MyQueue(queue.Queue):
    def show_value(self, i):
        print(self.queue[i])

    def sum(self):
        return sum(self.queue)

    def ave(self):
        return self.sum() / self.qsize()


#Contrôle de fonctionnement
q = MyQueue()
q.put(1)
q.put(2)
q.put(6)
q.put(8)
q.show_value(2)  # 6
print(q.sum())  # 17
print(q.ave())  # 4.25

Vous avez maintenant créé une nouvelle classe MyQueue qui hérite de la classe Queue et développé ses fonctionnalités. Le coût est faible car il n'y a aucune opération inutile, et surtout, le code est propre. À ce niveau, si vous essayez de faire quelque chose de plus compliqué, cela fera une grande différence.

Résumé

Cette fois, j'ai hérité de la file d'attente de la bibliothèque existante et l'ai personnalisée à mon goût.

Il est également important d'avoir la capacité de pousser et de résoudre ce que vous pouvez faire maintenant. Cependant, si vous avez le temps et la solution, il est judicieux de choisir une méthode plus simple. Le code sera plus propre et sera bon pour l'avenir.

Recommended Posts

Hériter de la bibliothèque standard pour trouver la valeur moyenne de Queue
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Trouvez l'écart moyen / standard des valeurs de luminosité dans l'image
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Comment trouver la zone du diagramme de Boronoi
Trouver la main de "Millijan" par l'optimisation des combinaisons
Découvrez la fraction de la valeur saisie en python
[Calcul scientifique / technique par Python] Calcul numérique pour trouver la valeur de la dérivée (différentielle)
[Python] Calculez la valeur moyenne de la valeur de pixel RVB de l'objet
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib
J'ai essayé de trouver l'entropie de l'image avec python
Changer la valeur de paramètre de setting.py en fonction de l'environnement de développement
Comment déboguer une bibliothèque Python standard dans Visual Studio
Trouver l'index de la valeur maximale (valeur minimale) d'un tableau multidimensionnel
Paramètres pour entrer et déboguer le contenu de la bibliothèque avec VS Code
Comment trouver la quantité moyenne d'informations (entropie) de la distribution de probabilité d'origine à partir de l'échantillon
Comment trouver le coefficient de mise à l'échelle d'une ondelette bipolaire
Astuces: [Python] Calculez la valeur moyenne de la zone spécifiée avec bedgraph
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
[Python] Trouvez la deuxième plus petite valeur.
À propos de la valeur de retour de pthread_mutex_init ()
À propos de la valeur de retour de l'histogramme.
Supplément à l'explication de vscode
Comment connaître le nombre de processeurs sans utiliser la commande sar
J'ai mesuré 6 méthodes pour obtenir l'indice de la valeur maximale (valeur minimale) de la liste
Paramètre pour entrer le contenu de la bibliothèque avec pytest et effectuer un test de débogage
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
Une note sur les fonctions de la bibliothèque Linux standard qui gère le temps
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
Trouvez la valeur minimale de la fonction par la méthode d'optimisation du groupe de particules (PSO)
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
Dispersion avec la bibliothèque standard et l'oreiller de Python Trouvez l'écart type RVB de l'image et déterminez s'il est monochromatique
Trouvons la valeur maximale python (correction ver)
Trouvez l'aire de l'ensemble somme des rectangles qui se chevauchent
L'histoire d'essayer de reconnecter le client
Script pour changer la description de fasta
10 méthodes pour améliorer la précision de BERT
Comment vérifier la version de Django
Définir le fuseau horaire sur l'heure standard japonaise
L'histoire de la mise en place de MeCab dans Ubuntu 16.04
Trouvez la valeur SHA256 avec R (avec bonus)
Appliquer la formule de propagation d'erreur à l'erreur standard
Utilisez .flatten () [0] de numpy pour récupérer la valeur
Version Migemo de la commande: find ,: mfind
Obtenez la valeur de la couche intermédiaire de NN
L'histoire du changement de pep8 en pycodestyle
Trouvez le coefficient du polypole le moins carré
Organisation de bibliothèques professionnelles compétitives ~ dés ~
Rendre la valeur par défaut de l'argument immuable
J'ai utilisé gawk pour connaître la valeur maximale qui entre dans NF.
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Un débutant en programmation a essayé de vérifier le temps d'exécution du tri, etc.
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
[Calcul scientifique / technique par Python] Solution analytique sympa pour résoudre des équations
Comment trouver le coefficient de la courbe approximative passant par les sommets en Python