Performance von Pmw

Fragen zu Tkinter.
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Performance von Pmw

Beitragvon Mawilo » Dienstag 21. Februar 2006, 22:00

Hallo,

ich wollte ein Programm erstellen, in dem ein ScrolledFrame von Pmw erstellt wird. In dem Frame werden Entrys plaziert. Das ist für wenige unkritisch. Leider benötige ich ca. 370 Spalten und ca 250 Zeilen. Wenn da 30 Spalten erzeugt wurden, bin ich mit Papier und Bleistift schneller als Pmw :evil:

Hier mal ein Beispiel:

Code: Alles auswählen

# -*- coding: utf-8 -*-
import Tkinter
import time
import Pmw

def kalenderfelder():
    for day in xrange(25):
        t_start = time.time()
        label = Tkinter.Label(scrollFrame.interior(),width=5,text=day)
        label.grid(row=0,column=day)
        for line in xrange(1,220,1):
            entry = Tkinter.Entry(scrollFrame.interior(),width=5)
            entry.grid(row=line,column=day)
            scrollFrame.update()
        t_end = time.time()
        print 'Dauer für Spalte %s :%s'%(day,t_end-t_start)

root = Tkinter.Tk()
scrollFrame = Pmw.ScrolledFrame(root,
                    usehullsize = 1,
                    hull_width = 900,
                    hull_height = 600)
                                               
scrollFrame.pack()
kalenderfelder()
root.mainloop()

Die Ausgabe zeigt, dass für jede Spalte mehr Zeit benötigt wird.

Code: Alles auswählen

Dauer für Spalte 1 :0.513622999191
Dauer für Spalte 2 :0.670331001282
Dauer für Spalte 3 :0.827666044235
Dauer für Spalte 4 :0.983643054962
Dauer für Spalte 5 :1.25213503838
Dauer für Spalte 6 :1.36018490791
Dauer für Spalte 7 :1.62683677673
Dauer für Spalte 8 :1.82541584969
Dauer für Spalte 9 :2.7952029705
Dauer für Spalte 10 :3.18780589104
Dauer für Spalte 11 :2.583288908
Dauer für Spalte 12 :3.97931480408
Dauer für Spalte 13 :4.31512999535
Dauer für Spalte 14 :3.57186794281
Dauer für Spalte 15 :3.81132388115
Dauer für Spalte 16 :4.21458101273
Dauer für Spalte 17 :4.33394694328
Dauer für Spalte 18 :4.53778100014
Dauer für Spalte 19 :4.81774783134
Dauer für Spalte 20 :5.10618305206
Dauer für Spalte 21 :5.23600697517
Dauer für Spalte 22 :5.3913230896
Dauer für Spalte 23 :5.62774085999
Dauer für Spalte 24 :5.8852159977

Nun habe ich in dem Beispiel aber nur 24 Spalten und keine 370.
Das bringt mich auf zwei Fragen:
Warum dauert das Erstellen einer Spalte immer länger?
Wie geht so etwas schneller?

Stephan
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Performance von Pmw

Beitragvon gerold » Dienstag 21. Februar 2006, 22:23

Stephan hat geschrieben:ich wollte ein Programm erstellen, in dem ein ScrolledFrame von Pmw erstellt wird.

Hi Stephan!

Ich kenne Pmw nicht und weiß auch nicht genau, was der Befehl so tut, aber vielleicht hilft es schon, scrollFrame.update() nur einmal zum Schluss auszuführen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Beitragvon Mr_Snede » Mittwoch 22. Februar 2006, 00:21

schau dir mal aus dem Tix Paket
http://tix.sourceforge.net/docs/html/Ti ... xBook.html
-> Tabular Listbox
und
-> Hierarchical Listbox
an.

oder:
http://aspn.activestate.com/ASPN/Cookbo ... cipe/52266

Sorry, wenn ich nicht direkt was zu deinem Code habe.

cu Sebastian



edit:
hatte fast vergesen, das ich sowas ähnliches benutze:
http://spuddel.sp.funpic.de/dokuwiki2/d ... ontolister
(der dort abgebildete Quellcode ist eher als Machbarkeitsstudie gedacht)

Habe als Ausgang eine Verschachte Liste und benutze zum Iterieren enumerate
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Mittwoch 22. Februar 2006, 14:09

Ich hatte erst überhaupt kein scrollFrame.update() drin. Hat genau so lange gedauert - nur habe ich nichts am Bildschirm gesehen.

Das schlimme ist ja noch, wenn ich das Programm beenden möchte, dauert das auch wieder ewig.
Brok3r
User
Beiträge: 29
Registriert: Montag 24. Oktober 2005, 13:48

Beitragvon Brok3r » Donnerstag 23. Februar 2006, 10:49

So da ich selbst recht viel Erfahrung mit Pmw habe, dachte ich ich mache mal einige Tests:

zunächst mal die Zeiten wie ich sie mit deiner Funktion benötigt habe:
Dauer für Spalte 0 :2.65799999237
Dauer für Spalte 1 :0.219000101089
Dauer für Spalte 2 :0.343999862671
Dauer für Spalte 3 :0.31299996376
Dauer für Spalte 4 :0.391000032425
Dauer für Spalte 5 :0.531000137329
Dauer für Spalte 6 :0.547999858856
Dauer für Spalte 7 :0.608999967575
Dauer für Spalte 8 :0.703999996185
Dauer für Spalte 9 :0.766000032425
Dauer für Spalte 10 :0.84500002861
Dauer für Spalte 11 :0.93799996376
Dauer für Spalte 12 :1.03200006485
Dauer für Spalte 13 :1.14100003242
Dauer für Spalte 14 :1.23600006104
Dauer für Spalte 15 :1.32899999619
Dauer für Spalte 16 :1.42299985886
Dauer für Spalte 17 :1.54800009727
Dauer für Spalte 18 :1.64199995995
Dauer für Spalte 19 :1.76699995995
Dauer für Spalte 20 :1.87599992752
Dauer für Spalte 21 :2.00100016594
Dauer für Spalte 22 :2.15799999237
Dauer für Spalte 23 :2.28299999237
Dauer für Spalte 24 :2.83099985123

dann eine zusammengebastelt eigene Funktion die über Instanzen arbeitet:

Code: Alles auswählen

def kalenderfelder():
    entry_list = []
    for day in xrange(25):
        t_start = time.time()
        label = Tkinter.Label(scrollFrame.interior(),width=5,text=day)
        label.grid(row=0,column=day)
        for line in xrange(1,220,1):
            entry = Tkinter.Entry(scrollFrame.interior(),width=5)
            entry_list.append(entry)
            scrollFrame.update()
        t_end = time.time()
        print 'Dauer für Spalte %s :%s'%(day,t_end-t_start)
    j = 0
    for day in xrange(25):
        t_start = time.time()
        for line in xrange(1,220,1):
            entry_list[j].grid(row = line, column = day)
            scrollFrame.update()
            j += 1
        t_end = time.time()
        print 'Dauer für Spalte %s :%s'%(day,t_end-t_start)
    scrollFrame.update()


die Zeiten hier:

Dauer für Spalte 0 :3.65899991989
Dauer für Spalte 1 :0.203000068665
Dauer für Spalte 2 :0.25
Dauer für Spalte 3 :0.31299996376
Dauer für Spalte 4 :0.360000133514
Dauer für Spalte 5 :0.405999898911
Dauer für Spalte 6 :0.485000133514
Dauer für Spalte 7 :0.515999794006
Dauer für Spalte 8 :0.594000101089
Dauer für Spalte 9 :0.65700006485
Dauer für Spalte 10 :0.703999996185
Dauer für Spalte 11 :0.780999898911
Dauer für Spalte 12 :0.84500002861
Dauer für Spalte 13 :0.921999931335
Dauer für Spalte 14 :1.01700019836
Dauer für Spalte 15 :1.07899999619
Dauer für Spalte 16 :1.17199993134
Dauer für Spalte 17 :1.26699995995
Dauer für Spalte 18 :1.09500002861
Dauer für Spalte 19 :1.14100003242
Dauer für Spalte 20 :1.22000002861
Dauer für Spalte 21 :1.26599979401
Dauer für Spalte 22 :1.34500002861
Dauer für Spalte 23 :1.39200019836
Dauer für Spalte 24 :1.45399999619

und nun abschliessend die selbe Funktoin ohne zwischenzeitliches frame updating sondern nur einem finalen update nach dem durchlaufen der schleifen:


Dauer für Spalte 0 :0.0320000648499
Dauer für Spalte 1 :0.0149998664856
Dauer für Spalte 2 :0.0160000324249
Dauer für Spalte 3 :0.0310001373291
Dauer für Spalte 4 :0.0160000324249
Dauer für Spalte 5 :0.0309998989105
Dauer für Spalte 6 :0.0160000324249
Dauer für Spalte 7 :0.0309998989105
Dauer für Spalte 8 :0.0310001373291
Dauer für Spalte 9 :0.0319998264313
Dauer für Spalte 10 :0.0310001373291
Dauer für Spalte 11 :0.0309998989105
Dauer für Spalte 12 :0.047000169754
Dauer für Spalte 13 :0.0309998989105
Dauer für Spalte 14 :0.0469999313354
Dauer für Spalte 15 :0.047000169754
Dauer für Spalte 16 :0.0469999313354
Dauer für Spalte 17 :0.0469999313354
Dauer für Spalte 18 :0.0469999313354
Dauer für Spalte 19 :0.047000169754
Dauer für Spalte 20 :0.0469999313354
Dauer für Spalte 21 :0.0620000362396
Dauer für Spalte 22 :0.0629999637604
Dauer für Spalte 23 :0.0620000362396
Dauer für Spalte 24 :0.0789999961853

nun meine Vermutung: Die Grafikkarte spielt nur bis zu einem gewissen Bereich mit danach zieht ein Frame update deine Performance extrem in die Knie. Würde versuchen deine Sache final mit einem update anzeigen zu lassen, wobei ich nicht verstehe warum es bei dir keine Auswirkung auf die PErformance hatet, wie du an meinem Beispiel siehst...
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Sonntag 5. März 2006, 18:13

Also, ich habe ne ganze Menge versucht. Der Spaltenaufbau dieser Größe ist furchtbar langsam. Liegt das nun an Pmw oder an meinem Rechner?
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Beitragvon Python 47 » Sonntag 5. März 2006, 18:21

Brok3r hat dir doch alles beantwortet!
mfg

Thomas :-)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder