Une compréhension approximative de python-fire et un mémo

L'article sur Python-fire est venu un peu, alors j'ai fait semblant de le voir.

Environnement où l'opération a été confirmée

Impressions quand je viens de lire le READ ME moi-même

ʻArgparse` est bon, non?

Comparer en fait

Considérons une CLI avec une simple sous-commande «retourne le résultat de l'ajout de deux arguments acceptés» ʻadd`. «calc-1.py» est celui qui reste à «python-fire», et «calc-2.py» le remplace par «argparse».

calc-1.py


import fire

class Calcurator(object):
    def add(self, first, second):
        return int(first) + int(second)

if __name__ == '__main__':
    fire.Fire(Calcurator)

calc-2.py


import argparse

parser = argparse.ArgumentParser()
parser.add_argument('mode')
parser.add_argument('first')
parser.add_argument('second')

class Calcurator(object):
    def add(self, first, second):
        return int(first) + int(second)

if __name__ == '__main__':
    args = parser.parse_args()
    cli = Calcurator()
    print(getattr(cli, args.mode)(args.first, args.second))

Je pense que la lisibilité sera considérablement améliorée. Si vous écrivez un petit traitement CLI, la partie analyseur d'arguments occupe une proportion considérable du code, il peut donc être apprécié si cela est éliminé.

Affichage de l'aide

Il semble que (subcommand) ---- hep prendra les informations d'argument.

calc-1.py


$ python calc-1.py add  -- --help
Type:        method
String form: <bound method Calcurator.add of <__main__.Calcurator object at 0x1036f8fd0>>
File:        ~/Dropbox (nijibox)/Applications/act/calc-1.py
Line:        5

Usage:       calc-1.py add FIRST SECOND
             calc-1.py add --first FIRST --second SECOND

calc-2.py


$ python calc-2.py -h
usage: calc-2.py [-h] mode first second

positional arguments:
  mode
  first
  second

optional arguments:
  -h, --help  show this help message and exit

Les informations sur les fichiers sont un peu intrusives, mais elles semblent jouer un rôle d'utilisation.

Comparez le temps de traitement

Si vous appelez sans réfléchir, calc-1.py est évidemment plus lent.

$ time python calc-1.py add 12345 67890
80235
python calc-1.py add 12345 67890  0.60s user 0.29s system 30% cpu 2.945 total

$ time python calc-2.py add 12345 67890
80235
python calc-2.py add 12345 67890  0.07s user 0.07s system 77% cpu 0.179 total

Si vous ne le comparez qu'une seule fois, cela ressemble à ceci. Il semble y avoir une différence d'environ 0,5 seconde.

Alors, j'ai essayé de faire une telle boucle.

loop.py


import sys
import subprocess

script = sys.argv[1]
count = int(sys.argv[2])

for _ in range(count):
    proc = subprocess.Popen('python {} add 12345 67890'.format(script).split(), stdout=None)
    proc.communicate()

loop.py


$ time python loop.py calc-1.py 10 > /dev/null
python loop.py calc-1.py 10 > /dev/null  4.29s user 1.20s system 97% cpu 5.651 total

$ time python loop.py calc-2.py 10 > /dev/null
python loop.py calc-2.py 10 > /dev/null  0.40s user 0.17s system 93% cpu 0.614 total

$ time python loop.py calc-1.py 100 > /dev/null
python loop.py calc-1.py 100 > /dev/null  45.53s user 12.45s system 88% cpu 1:05.32 total

$ time python loop.py calc-2.py 100 > /dev/null
python loop.py calc-2.py 100 > /dev/null  3.39s user 1.06s system 94% cpu 4.731 total

J'ai essayé de le répéter plusieurs fois, mais en moyenne, il semble que cela prenne environ 0,4 à 0,5 seconde de plus. Étant donné que le traitement principal de l'exemple de code est trop simple, il semble qu'il y ait suffisamment de cas pour qu'il s'agisse d'une erreur de fonctionnement réel.

Impressions après vérification légère

python-fire sympa

Recommended Posts

Une compréhension approximative de python-fire et un mémo
[Python] Une compréhension approximative des itérables, des itérateurs et des générateurs
[Python] Une compréhension approximative du module de journalisation
Un résumé approximatif des différences entre Windows et Linux
Un résumé approximatif de l'histoire du système d'exploitation
Comprendre le mémo de la programmation collective des connaissances
Un petit examen minutieux de Pandas 1.0 et Dask
Un mémo contenant Python2.7 et Python3 dans CentOS
Connectez beaucoup de Python ou et et
Mémorandum sur le QueryDict de Django
Compréhension complète de la programmation orientée objet de Python
Un mémo expliquant la spécification de l'axe de l'axe
Compréhension complète du threading Python et du multitraitement
Un mémo qui a fait un tutoriel pour exécuter python sur heroku
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 1
Compréhension complète des concepts de Bellmanford et Dyxtra
Un mémorandum d'étude et de mise en œuvre du Deep Learning
Un mémo créé dans un package et enregistré dans PyPI
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 2
Prise en compte des forces et faiblesses de Python
Mémo connecté à HiveServer2 d'EMR avec python
Remarques sur l'utilisation d'AIST Spacon ABCI
Un mémo pour comprendre visuellement l'axe des pandas.
Une histoire d'essayer pyenv, virtualenv et virtualenvwrapper
[PyTorch] Un peu de compréhension de CrossEntropyLoss avec des formules mathématiques
Remarques sur l'installation de Chainer 1.5 pour GPU sous Windows
Une comparaison rapide des bibliothèques de test Python et node.js
Créez un lot d'images et gonflez avec ImageDataGenerator
Traitement asynchrone de Python ~ Comprenez parfaitement async et attendez ~
expression canonique python ou mémo d'objet correspondant
Obtenez une compréhension abstraite des modules et des packages Python
Mémorandum elasticsearch_dsl
À la suite du montage et du réglage avec POH! Lite
Transformez le nombre de secondes donné en heures, minutes et secondes
Comprendre la signification des formules de distribution normale complexes et bizarres
Détecter les objets d'une couleur et d'une taille spécifiques avec Python
Une note sur le comportement de bowtie2 lors de plusieurs coups
Comment développer dans un environnement virtuel Python [Memo]
Python: créer un dictionnaire à partir d'une liste de clés et de valeurs
Un mémo que j'ai écrit une fonction de base en Python en utilisant la récurrence