Ein Code wunder Performanter machen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mimocloud
User
Beiträge: 31
Registriert: Freitag 3. Mai 2013, 15:12

Moin leutz,

Kann mir hier vllt. jemand zeigen wie ich meinen Code performanter gestallte. Ich meine eine Datei 10 mal zu öffnen und zu schreiben ist bestimmt nicht so schlau wie einmal zu öffnen und einmal zu beschreiben!
Würde mich über einen fertigen Code-Snippet sehr freuen!


CODE:

Code: Alles auswählen

import shutil
from tempfile import mktemp
import argparse
import os

parser = argparse.ArgumentParser(description='Build Cloud iso Image.') #Argumente umwandeln
parser.add_argument('--source', '-sr',
                    action='store',
                    help='Sourcepath -sr or --source')

parser.add_argument('--destination', '-dn',
                    action='store',
                    help='Targetpath -dn or --destination')

parser.add_argument('--password', '-pw',
                    action='store',
                    help='Root image password -pw or --password')

parser.add_argument('--networkmode', '-n',
                    action='store',
                    help='Networkmode -nm or --networkmode')

parser.add_argument('--ipadress', '-ip',
                    action='store',
                    help='Ipadress -ip or --ipadress')

parser.add_argument('--gateway', '-gw',
                    action='store',
                    help='Gateway -gw or --gateway')

parser.add_argument('--nameserver', '-ns',
                    action='store',
                    help='Nameserver -ns or --nameserver')

parser.add_argument('--netmask', '-nm',
                    action='store',
                    help='Netmask -nm or --netmask')

parser.add_argument('--hostname', '-hn',
                    action='store',
                    help='Hostname -hn or --hostname')

args = parser.parse_args()

final_path = mktemp(prefix='tmpiso_', dir=args.destination)
shutil.copytree(args.source, final_path)
cfgedit = os.path.join(final_path, 'autounattend.cfg')

p = open(cfgedit).read()
p = p.replace("%PASSWORD", args.password)
pw = open(cfgedit, 'w')
pw.write(p)
pw.close()

nw = open(cfgedit).read()
nw = nw.replace("%NWMODE", args.networkmode)
nwm = open(cfgedit, 'w')
nwm.write(nw)
nwm.close()

ip = open(cfgedit).read()
ip = ip.replace("%IP_ADDRESS", args.ipadress)
ipa = open(cfgedit, 'w')
ipa.write(ip)
ipa.close()


gw = open(cfgedit).read()
gw = gw.replace("%GATEWAY", args.gateway)
gwa = open(cfgedit, 'w')
gwa.write(gw)
gwa.close()

ns = open(cfgedit).read()
ns = ns.replace("%NAME_SERVER_IP", args.nameserver)
nsi = open(cfgedit, 'w')
nsi.write(ns)
nsi.close()


nm = open(cfgedit).read()
nm = nm.replace("%NETMASK", args.netmask)
nma = open(cfgedit, 'w')
nma.write(nm)
nma.close()

hn = open(cfgedit).read()
hn = hn.replace("%HOSTNAME", args.hostname)
hns = open(cfgedit, 'w')
hns.write(hn)
hns.close()


exit()

Danke im Voraus!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Dann öffne, lese und schreibe die Datei doch einfach nicht so oft. Wenn du verstanden hast was die replace-Methode macht, dann sollte das für dich kein Problem sein. Außerdem solltest du Dateien mittels with-Statement öffnen, dann vergisst du auch nicht, wie momentan, die Dateien auch alle wieder korrekt zu schließen.

Noch als Hinweis zum Programmieren: wenn du Code kopierst, dann machst du immer etwas falsch. Üblicherweise liegt das an der Wahl der falschen Kontroll- oder Datenstrukturen.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo mimocloud,

eigentlich müßtest Du so langsam merken, dass Du ohne ein paar Grundlagen in Programmierung allgemein und Python speziell nicht weiter kommst.
Wenn Du wüßtest, was in p, nw, ip, gw, ns usw. steht, müßtest Du solche Fragen nicht stellen.
Tipp: einfach mal ausgeben lassen ;-)
mimocloud
User
Beiträge: 31
Registriert: Freitag 3. Mai 2013, 15:12

Ich meine drinnen stehen sollte ja denk ich mal die Eingabe vor dem Scriptaufruf -ip...
BlackJack

@mimocloud: Die Optionen noch einmal im `help`-Text zu schreiben macht übrigens keinen Sinn. Lass Dir von Deinem Programm die Hilfe mal ausgeben, dann siehst Du was ich meine.
mimocloud
User
Beiträge: 31
Registriert: Freitag 3. Mai 2013, 15:12

Ja und?

Code: Alles auswählen

Build Cloud iso Image.

optional arguments:
  -h, --help            show this help message and exit
  --source SOURCE, -sr SOURCE
                        Sourcepath -sr or --source
  --destination DESTINATION, -dn DESTINATION
                        Targetpath -dn or --destination
  --password PASSWORD, -pw PASSWORD
                        Root image password -pw or --password
  --networkmode NETWORKMODE, -n NETWORKMODE
                        Networkmode -nm or --networkmode
  --ipadress IPADRESS, -ip IPADRESS
                        Ipadress -ip or --ipadress
  --gateway GATEWAY, -gw GATEWAY
                        Gateway -gw or --gateway
  --nameserver NAMESERVER, -ns NAMESERVER
                        Nameserver -ns or --nameserver
  --netmask NETMASK, -nm NETMASK
                        Netmask -nm or --netmask
  --hostname HOSTNAME, -hn HOSTNAME
                        Hostname -hn or --hostname
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann schau dir doch mal eine Option an. Zu "--source SOURCE, -sr SOURCE steht im Hilfetext: "Sourcepath -sr or --source". Das erneute Aufführen von -sr und --source ist hier überflüssig, da genau diese Optionen doch beschrieben werden. Im schlimmsten Fall führt das sogar noch zu Inkonsistenzen, falls mal eine Option geändert wird.
Das Leben ist wie ein Tennisball.
BlackJack

@mimocloud: Welcher von den Hilfetexten dort ist denn wirklich *hilfreich*? Wo steht mehr im Hilfetext als in der Zeile davor schon automatisch aus den Optionen generiert wurde? Warum schreibst Du die genrierte Information da *nochmal* hin? Die Arbeit und die Fehlerquelle kann man sich echt sparen. Oder man schreibt da tatsächlich Hilfetexte mit echtem Nutzen für den Anwender hin.
mimocloud
User
Beiträge: 31
Registriert: Freitag 3. Mai 2013, 15:12

So vllt. Besser?


Code: Alles auswählen

import shutil
from tempfile import mktemp
import argparse
import os

parser = argparse.ArgumentParser(prog='PROG',description='Build Cloud iso Image.', usage='%(prog)s [options -paravar]') #Argumente umwandeln
parser.add_argument('--source', '-sr',
                    action='store',
                    help='Sourcepath -sr or --source')

parser.add_argument('--destination', '-dn',
                    action='store',
                    help='Targetpath -dn or --destination')

parser.add_argument('--password', '-pw',
                    action='store',
                    help='Root image password -pw or --password')

parser.add_argument('--networkmode', '-n',
                    action='store',
                    help='Networkmode -nm or --networkmode')

parser.add_argument('--ipadress', '-ip',
                    action='store',
                    help='Ipadress -ip or --ipadress')

parser.add_argument('--gateway', '-gw',
                    action='store',
                    help='Gateway -gw or --gateway')

parser.add_argument('--nameserver', '-ns',
                    action='store',
                    help='Nameserver -ns or --nameserver')

parser.add_argument('--netmask', '-nm',
                    action='store',
                    help='Netmask -nm or --netmask')

parser.add_argument('--hostname', '-hn',
                    action='store',
                    help='Hostname -hn or --hostname')

args = parser.parse_args()

final_path = mktemp(prefix='tmpiso_', dir=args.destination)
shutil.copytree(args.source, final_path)
cfgedit = os.path.join(final_path, 'autounattend.cfg')

e = open(cfgedit).read()
e = e.replace("%PASSWORD", args.password)
e = e.replace("%NWMODE", args.networkmode)
e = e.replace("%IP_ADDRESS", args.ipadress)
e = e.replace("%GATEWAY", args.gateway)
e = e.replace("%NAME_SERVER_IP", args.nameserver)
e = e.replace("%NETMASK", args.netmask)
e = e.replace("%HOSTNAME", args.hostname)
we = open(cfgedit, 'w')
we.write(e)
we.close()



exit()

Oder doch lieber so?

Code: Alles auswählen

f = open(cfgedit, 'wr')
text = f.read()

text = text.replace("%PASSWORD", args.password)
text = text.replace("%NWMODE", args.networkmode)
text = text.replace("%IP_ADDRESS", args.ipadress)
text = text.replace("%GATEWAY", args.gateway)
text = text.replace("%NAME_SERVER_IP", args.nameserver)
text = text.replace("%NETMASK", args.netmask)
text = text.replace("%HOSTNAME", args.hostname)

f.write(text)
f.close()
Zuletzt geändert von mimocloud am Montag 6. Mai 2013, 14:36, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich verweise einfach mal auf meinen ersten Beitrag in diesem Thread.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@mimocloud: ich seh jetzt nicht wirklich, was sich an den Optionen geändert hat, aber vielleicht brauche ich auch eine neue Brille.

Wie oft sollen wir noch wiederholen, dass Du »with« beim Dateiöffnen benutzen sollst?
mimocloud
User
Beiträge: 31
Registriert: Freitag 3. Mai 2013, 15:12

Ja jut!
Ich frag mich nur wo da der elementare Unterschied ist!
Jetzt öffne ich ja die Datei diese wird in den Speicher geladen... Abgeändert und dann wieder mit close() geschlossen. Wo wird die Datei denn da schlechter oder besser wieder geschlossen?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

mimocloud hat geschrieben:Wo wird die Datei denn da schlechter oder besser wieder geschlossen?
Tatsächlich macht das keinen Unterschied – solange man es denn tut. Wenn Du Dir Deinen Code aber genauer ansiehst, wirst Du feststellen, dass nicht alle Dateien wieder korrekt geschlossen werden. Mit 'with' wäre Dir das nicht passiert.
Antworten