Performance Frage: 2d Liste vs. 1d Objekt Liste

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
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

Hi,
ich schon wieder.
Mal eine Frage zur Performance von Python:

Stellen wir uns eine Maschine vor, die 1 Teil A,1 Teil B und 1 Teil C braucht um 1 Teil X zu produzieren.
Wie speichere ich das performancetechnsich besser ab:

Code: Alles auswählen

input = [[teilA,1][teilB,1],[teilC]]
for x,y in input:
print x
#...dosth...
oder ist es so günstiger:

Code: Alles auswählen

class Input:
def _init__(self,x,y)
self.Teil=x
self.Menge=y

input=[Input(teilA,1),Input(teilB,2),Input(teilC,3)]
for x in input:
print x.Teil
#...dosth...
Was ist da in Hinblick auf Perfomance die bessere Lösung, falls denn eine besser ist..?

Danke und Gruß
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Das kommt natürlich darauf an, wie du die Daten verwendest. Wie viele Einträge willst du überhaupt speichern?

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

@LiLaLaunebär: Ich würde hier sagen das die Leistung hier egal sein sollte solange man nicht definitiv ein Problem damit hat. Und zwar ein belegbares, nicht ein vermutetes. Das ist eine "Mikrooptimierung" bei der man sich IMHO immer ersteinmal für die lesbarere und wartbarere Variante entscheiden sollte.
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

es werden nicht viele einträge sein. denke so 5 pro liste. allerdings wird es viele listen geben...so an die 100.
und auf die wird häufig zugegriffen...sagen wir 5000 mal pro liste während der gesamten laufzeit der simulation. diese sollte allerdings in möglichst kurzer zeit ausgeführt werden, da es sich letztendlich um ein decision support system handeln soll (aber ob es das auch wird??? :lol: ).
weiß nicht ob man das noch als klein oder schon als groß einordnet, hab da 0 erfahrung :?:
hab davon leider keine ahnung, also was so performance fragen betrifft. aber wenn man hier was suboptimal wählt und dort...
ich kann es leider auch noch nicht testen, weil das tool noch nicht fertig ist, aber ich muss mich nun entscheiden.
BlackJack

@LiLaLaunebär: Wie gesagt -- IMHO kein Grund sich die Frage zu stellen. In diesem Stadium kann man entscheiden welche Komplexität die Algorithmen haben sollten, aber nicht solche Kleinigkeiten. Solange diese letztendlich konstanten Unterschiede kein nachweisliches Problem darstellen, sollte man sich damit auch nicht aufhalten.

Wenn die Anwendung steht, kann man immer noch den Profiler anwerfen und schauen wo *tatsächlich* die meiste Zeit verbraten wird, und dort dann *gezielt* ansetzen, als sich jetzt schon bei solchen Kleinigkeiten einen Kopf zu machen, wo man noch nicht einmal sicher ist, ob das am Ende im Gesamtsystem überhaupt merkliche Verbesserungen bringt.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

5000 sind nicht viel. Also quasi nix. Hast du mal Performancetests gemacht?


Edit: Also Tests um einfach mal ein Gefühl zu bekommen, wie schnell der Computer doch ist..
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

nein, habe ich noch nicht, weil das ganze ein skalierbares simulationsmodell wird.also das kann man dann beliebig groß machen...und wie groß es dann letztendlich sein wird weiß noch keiner...deshalb kann ich noch keinen performancetest machen.
aber ok, wenn 5000 nicht viel sind, dann wirds schon passen...
danke!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Solche Fragen kann man sich leicht selbst beantworten. Erzeuge dir einfach einen Haufen Daten und vergleiche die Laufzeit der beiden Variante. Dabei dürftest du feststellen, dass die Tupel-Variante eindeutig performanter ist als die Klassen-Variante. Wenn du tatsächlich nicht mehr Informationen brauchst, als die Teile-ID und die Anzahl, dann gibt es IMHO - abgesehen von der Performance - auch im Hinblick auf das Design keinen Grund, hier eine Klasse einzusetzen. Ggf. könntest du noch namedtuple einsetzen. Wie performant die sind, habe ich allerdings noch nicht ausprobiert.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

solange du nicht viel mit den Listen "hantierst" (z.B. Elemente vorne einfügen, Elemente löschen), sollte das IMHO egal sein.

IMHO ist ein einfachere Alternative als eine eigene Klasse aber ein Dict. Z.B.:

Code: Alles auswählen

input1 = {"teil1":1, "teil2":1,"teil3":1}
input2 = {...}
Ob das aber schneller oder langsamer ist als eine Liste von Listen -> musst du Messen :D

Gruß, noisefloor
Antworten