Seite 1 von 1

Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 09:26
von mimocloud
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!

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 09:33
von EyDu
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.

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 10:43
von Sirius3
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 ;-)

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 10:46
von mimocloud
Ich meine drinnen stehen sollte ja denk ich mal die Eingabe vor dem Scriptaufruf -ip...

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 10:48
von 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.

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 13:09
von mimocloud
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

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 13:20
von EyDu
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.

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 13:21
von 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.

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 13:30
von mimocloud
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()

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 13:34
von EyDu
Ich verweise einfach mal auf meinen ersten Beitrag in diesem Thread.

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 13:35
von Sirius3
@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?

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 18:11
von mimocloud
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?

Re: Ein Code wunder Performanter machen

Verfasst: Montag 6. Mai 2013, 19:15
von kbr
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.