On Mon, Jul 12, 2010 at 9:09 PM, Tim Evans <[email protected]> wrote:
> On 2010-07-13 3:48, Cornelius Kölbel wrote:
>> Dear list,
>>
>> I got an array of dictionaries, that I want to add to a GTKListStore,
>> that is displayed an a treeview.
>>
>> This is very slow. I already replaced the liststore.append by
>> liststore.insert, which is much much faster.
>> But still, filling the 10.000 values takes about 50 seconds.
>>
>> Is there any cool mapping function, to push the array to the liststore?
>> I used a for loop to iterate over the array...
>> I also tried while an to pop the array elements...
>>
>> It is something like this:
>>
>> data: array of dictionaries
>>
>> data = array( { 'v1' : 'something', 'v2': 'something else' } ,
>>                { 'v1' : 'another',   'v2': 'something completely diff' }
>>               )
>>
>>
>> for d in data:
>>     self.liststore.insert( 0, ( d.get("v1"), d.get("v2") ....))
>>
>>
>> ...is there a better way than doing a for loop?
>> ...or a way to not have to interate over the 10.000 dicts?
>>
>> ...or is there a cool reading on performance tuning pyton?
>
> Some general ideas:
>  - Make sure the store isn't being viewed when you insert data, that
>    will slow it down.
>
>  - Do attribute lookups outside big loops:
>
>     append = self.liststore.append
>     get = d.get
>     for d in data:
>         append(0, (get('v1'), get('v2'), ...))

This sample won't work since you are using "d" before it is bound in
the for loop.  Also, the "append" method only takes one argument: the
row to be added to the store.  Here's another way, assuming that there
are not too many keys to be looked up:

append = self.liststore.append
from operator import itemgetter
v1 = itemgetter('v1')
v2 = itemgetter('v2')
v3 = itemgetter('v3')
...
for d in data:
    append((v1(d), v2(d), v3(d), ...))

Yet another approach:  If you can use OrderedDict (new in Python 2.7
and 3.1), you can do this:

append = self.liststore.append
for d in data:
   append(d.values())




>
>  - Put the treeview into fixed height and width mode. Automatic sizing
>    is the enemy of treeview performance. This only works if all your
>    rows are the same height. The function calls you need are:
>      gtk.TreeViewColumn.set_sizing
>         with the gtk.TREE_VIEW_COLUMN_FIXED value
>      gtk.TreeViewColumn.set_fixed_width
>      gtk.TreeView.set_fixed_height_mode
>
>  - If your list is large enough it may be worth subclassing
>    gtk.TreeModel and overriding the required methods. It's complex, but
>    it can avoid referencing all your data at tree build time, instead
>    loading as the user scrolls.
>
>  - Write it in C. Always valid, even if as a last resort.
>
> --
> Tim Evans
> Applied Research Associates NZ
> http://www.aranz.com/
> _______________________________________________
> pygtk mailing list   [email protected]
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://faq.pygtk.org/
>



-- 
Gerald Britton
_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to