Der Artikel über Python-fire ist ein wenig aufgetaucht, also habe ich so getan, als würde ich ihn sehen.
Ist es nicht gut mit "Argparse"?
Stellen Sie sich eine CLI mit dem einfachen Unterbefehl "add" vor, bei dem das Ergebnis des Hinzufügens zweier akzeptierter Argumente zurückgegeben wird.
calc-1.py
bleibt python-fire
überlassen, und calc-2.py
ersetzt es durch 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))
Ich bin der Meinung, dass die Lesbarkeit erheblich verbessert wird. Wenn Sie einen kleinen CLI-Prozess schreiben, nimmt der Argument-Parser-Teil einen beträchtlichen Teil des Codes ein. Es kann daher hilfreich sein, wenn dies beseitigt wird.
Es scheint, dass (Unterbefehl) ---- hep
die Argumentinformationen übernimmt.
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
Dateiinformationen sind etwas aufdringlich, scheinen jedoch als Verwendung eine Rolle zu spielen.
Wenn Sie ohne nachzudenken anrufen, ist calc-1.py
offensichtlich langsamer.
$ 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
Wenn Sie es einfach nur einmal vergleichen, sieht es so aus. Es scheint einen Unterschied von ungefähr 0,5 Sekunden zu geben.
Also habe ich versucht, eine solche Schleife zu machen.
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
Ich habe versucht, es ein paar Mal zu wiederholen, aber im Durchschnitt scheint es, dass es ungefähr 0,4 bis 0,5 Sekunden länger dauert. In Anbetracht der Tatsache, dass die Hauptverarbeitung des Beispielcodes zu einfach ist, scheint es genügend Fälle zu geben, in denen es sich um einen Fehler im tatsächlichen Betrieb handelt.
Python-Feuer
schön
Recommended Posts