Tkinter displaying 300 records sluggish

Irene Barg ibarg at as.arizona.edu
Mon Mar 10 18:53:33 CET 2003


Eric,

First, my apologies for this long post.  The module code was 30K, too 
long to post, hence the code snippet.  The function 'lineheight' gives
me the largest element in a row so that I can size the text widget.

    def lineheight(self,maxw,data):
        numchar = []
        for val in data:
            if val:  numchar.append(len(val))
        biggest = max(numchar)    #return the largest element in row
        h = (biggest / maxw) + 1
        return h

I ran profile, and below are some statistics below.  Note, the 2nd set
of statistics sorting on 'time', shows that the code is spending
8.97sec
inside the 'displayColumns' function, the code snippet in my original
post.  I just re-check 'displayColumns' function it just uses
Tkinter, no PMW calls.  BTW, I re-ran the code through profiler
with the call to 'lineheight' commented out, the times were actually
slightly higher.  On the Sun system, I am still running Python 2.1.1,
so I placed the following line at the very top of the main program:

from __future__ import nested_scopes #I am still using 2.1

In summary (output from profiler follows), it takes 1/2 the time
to load 300 records on the P4 under Linux, vs Sun Ultra under
Solaris.  The reporting of the statistics appears different
between Solaris and Linux (see details below). Your comments
are greatly appreciated!

Sun Ultra 60 2x360MHz, 256MBytes RAM (earlier posted wrong RAM):
Python 2.1.1 (#1, Aug  7 2001, 14:18:53) [C] on sunos5
Type "copyright", "credits" or "license" for more information.
IDLE 0.8 -- press F1 for help
>>> import pstats
>>> p=pstats.Stats('pubdbprof')
>>> p.sort_stats('cumulative').print_stats(10)
Mon Mar 10 09:07:13 2003    pubdbprof

         74980 function calls (67621 primitive calls) in 14.150 CPU
seconds

   Ordered by: cumulative time
   List reduced from 359 to 10 due to restriction <10>

   ncalls  tottime  percall  cumtime  percall
filename:lineno(function)
    377/1    0.000    0.000   14.150   14.150 <string>:1(?)
        1    0.000    0.000   14.150   14.150 profile:0(doit())
        1    0.000    0.000   14.150   14.150 pubdbmain.py:751(doit)
     16/5    0.010    0.001   13.920    2.784
/home/barg/local/lib/python2.1/site-packages/Pmw/Pmw_0_8_5/lib/PmwLoader.py:132(__getattr__)
     16/5    0.030    0.002   13.900    2.780
/home/barg/local/lib/python2.1/site-packages/Pmw/Pmw_0_8_5/lib/PmwLoader.py:70(_getmodule)
        1    0.000    0.000   13.640   13.640
pubdbmain.py:187(__init__)
        1    0.190    0.190   12.190   12.190
/home/barg/local/lib/python2.1/lib-tk/Tkinter.py:928(mainloop)
    57/47    0.010    0.000   12.040    0.256
/home/barg/local/lib/python2.1/site-packages/Pmw/Pmw_0_8_5/lib/PmwBase.py:1666(__call__)
        1    0.000    0.000   11.320   11.320
./dbutils/dbtools.py:177(searchDb)
        1    0.070    0.070   11.320   11.320
./dbutils/flatdb.py:145(getRowsWithValue)

>>> p.sort_stats('time').print_stats(10)
Mon Mar 10 09:07:13 2003    pubdbprof

         74980 function calls (67621 primitive calls) in 14.150 CPU
seconds

   Ordered by: internal time
   List reduced from 359 to 10 due to restriction <10>

   ncalls  tottime  percall  cumtime  percall
filename:lineno(function)
    11866    1.800    0.000    2.650    0.000
/home/barg/local/lib/python2.1/lib-tk/Tkinter.py:953(_options)
     2789    1.700    0.001    3.020    0.001
/home/barg/local/lib/python2.1/lib-tk/Tkinter.py:1744(__init__)
    17831    1.270    0.000    1.270    0.000
/home/barg/local/lib/python2.1/lib-tk/Tkinter.py:72(_cnfmerge)
        1    1.240    1.240    8.970    8.970
./dbforms.py:237(displayColumns)
  2789/40    1.050    0.000    1.530    0.038
/home/barg/local/lib/python2.1/lib-tk/Tkinter.py:1760(destroy)
     2675    0.890    0.000    1.570    0.001
/home/barg/local/lib/python2.1/lib-tk/Tkinter.py:1663(grid_configure)
     3191    0.750    0.000    1.520    0.000
/home/barg/local/lib/python2.1/lib-tk/Tkinter.py:1063(configure)
     3120    0.550    0.000    1.220    0.000
/home/barg/local/lib/python2.1/lib-tk/Tkinter.py:1152(_grid_configure)
        4    0.390    0.098    0.410    0.102
/home/barg/local/lib/python2.1/site-packages/Pmw/Pmw_0_8_5/lib/PmwBase.py:143(forwardmethods)
  2829/48    0.380    0.000    1.540    0.032
/home/barg/local/lib/python2.1/site-packages/Pmw/Pmw_0_8_5/lib/PmwBase.py:1644(__TkinterWidgetDestroy)

Pentium 4, 1.70GHz CPU, 260MB RAM:
Python 2.2.2 (#1, Jan  7 2003, 15:12:31) 
[GCC 3.2 20020903 (Red Hat Linux 8.0 3.2-7)] on linux2
Type "copyright", "credits" or "license" for more information.
IDLE 0.8 -- press F1 for help
>>> import pstats
>>> p=pstats.Stats('pubdbprof')
>>> p.sort_stats('cumulative').print_stats(10)
Mon Mar 10 10:22:32 2003    pubdbprof

         80116 function calls (73986 primitive calls) in 7.780 CPU
seconds

   Ordered by: cumulative time
   List reduced from 366 to 10 due to restriction <10>

   ncalls  tottime  percall  cumtime  percall
filename:lineno(function)
        1    0.000    0.000    7.780    7.780 profile:0(doit())
    377/1    0.010    0.000    7.780    7.780 <string>:1(?)
        1    0.000    0.000    7.770    7.770 pubdbmain.py:751(doit)
        1    0.430    0.430    6.980    6.980
//usr/lib/python2.2/lib-tk/Tkinter.py:935(mainloop)
  214/205    0.000    0.000    6.550    0.032
/usr/lib/python2.2/site-packages/Pmw/Pmw_1_1/lib/PmwBase.py:1710(__call__)
        1    0.000    0.000    3.250    3.250 pubdbmain.py:683(search)
        1    0.000    0.000    3.250    3.250
pubdbmain.py:687(dosearch)
        1    0.000    0.000    3.100    3.100
pubdbmain.py:709(showresults)
        1    0.320    0.320    3.070    3.070
dbforms.py:237(displayColumns)
    65/17    0.000    0.000    2.000    0.118
/usr/lib/python2.2/site-packages/Pmw/Pmw_1_1/lib/PmwBase.py:373(destroy)


<pstats.Stats instance at 0x8328a3c>
>>> p.sort_stats('time').print_stats(10)
Mon Mar 10 10:22:32 2003    pubdbprof

         80116 function calls (73986 primitive calls) in 7.780 CPU
seconds

   Ordered by: internal time
   List reduced from 366 to 10 due to restriction <10>

   ncalls  tottime  percall  cumtime  percall
filename:lineno(function)
  2816/45    1.790    0.001    1.990    0.044
//usr/lib/python2.2/lib-tk/Tkinter.py:1768(destroy)
    44/37    0.970    0.022    0.970    0.026
//usr/lib/python2.2/lib-tk/Tkinter.py:832(update_idletasks)
     2687    0.730    0.000    0.970    0.000
//usr/lib/python2.2/lib-tk/Tkinter.py:1678(grid_configure)
    12213    0.520    0.000    0.720    0.000
//usr/lib/python2.2/lib-tk/Tkinter.py:960(_options)
     2816    0.490    0.000    0.870    0.000
//usr/lib/python2.2/lib-tk/Tkinter.py:1752(__init__)
        1    0.430    0.430    6.980    6.980
//usr/lib/python2.2/lib-tk/Tkinter.py:935(mainloop)
        1    0.320    0.320    3.070    3.070
dbforms.py:237(displayColumns)
     3400    0.300    0.000    0.480    0.000
//usr/lib/python2.2/lib-tk/Tkinter.py:1071(configure)
    18411    0.300    0.000    0.300    0.000
//usr/lib/python2.2/lib-tk/Tkinter.py:72(_cnfmerge)
    16/13    0.240    0.015    0.380    0.029
/usr/lib/python2.2/site-packages/Pmw/Pmw_1_1/lib/PmwLoader.py:70(_getmodule)

Eric Brunel <eric.brunel at pragmadev.com> wrote in message news:<b4hjuv$dt7$1 at news-reader12.wanadoo.fr>...
> Irene Barg wrote:
> > Hello All,
> > 
> > I have a Tkinter/PMW GUI interface to a flatfile (in memory) database 
> > (FlatDB, written by Colin Svingen). When displaying 300 records, it takes approx 
> > 10 seconds on a Sun Ultra 60 2x360MHz, with 1024MBytes RAM running under 
> > Python 2.1, and scrolling through the results is slugish. On a Toshiba Satellite 
> > Pro, Pentium 4, 1.70GHz CPU, 260MB RAM, running RedHat Linux (v8.0)and Pytho2.2, 
> > it takes approx. 5 seconds to display 300 records, but scrolling is much faster. 
> > The result set is a list of lists. The actual size of the db is only 97K, which 
> > shouldn't be a problem with either machine. Are there any coding techniques to 
> > improve performance with Tkinter? Has this been documented anywhere?
> > 
> > The portion of code that handles the looping through the results follows.  
> > I appreciate your comments. --irene barg
> [snip code]
> 
> Looking at your code, I don't see any reason why you get these performances. But 
>   since the code is incomplete, it's actually quite hard to tell (e.g., what 
> does the method called "lineheight"?)
> 
> BTW, did you try to run your code through the profiler? You may discover that 
> Tkinter is not the cause of the problem...




More information about the Python-list mailing list