fast QListView numerical sort
a_salnikov at yahoo.com
Thu Feb 12 18:47:18 CET 2004
"Uwe Mayer" <merkosh at hadiko.de> wrote in message
news:c0fn8h$pfp$1 at news.rz.uni-karlsruhe.de...
> Using PyQt I got a QListView with about 800 entries now (but its intended
> be scalable up to about 3000).
> The first column contains numerical data. Now Qt does the sorting all by
> self and quite fast enough. By default it sorts alphanumerically, i.e. 1
> 100 101 110 111 2 ...
> Solutions on the web suggested left padding the digits with white spaces
> which didn't work for me.
Hmm, I'd expect it to work.
> Left padding with 0's does not look good.
> Qt Manual says you can overwrite the compare method
> which I did:
> QListViewItem.compare = lambda s,a,b,c: s.text(0).toInt()
> The compare method returns < 0 for "smaller", 0 for "equal", > 0 for
> Doing so works, but causes a 2 sec delay each time a re-sort has to be
> - which is rather annoying (at only less than 1/3 of its expected load!)
Well, this probably comes from PyQt's nature - its a layer between Qt
(which is C++)
and Python. QListView calls some C++ function to sort its items, which in
a lot of calls to QListViewItem::compare(). Every call to compare() has to
translated from C++ world to Python world, and the result returned back.
> Solutions I could come up with are:
> a. derive a C++ QListViewItem that does the numerical sorting and use this
> instead of the default QListViewItem in the hope it'll be faster
> pro: probably the easyest (faster? fast enough?)
> con: not portable
That should be fast enough, I guess, this is the ultimate speed you can
Why isn't it portable?
> b. implement all sorting and inserting related functions by myself in
> and do the sorting from Python
> pro: portable
> con: much more coding to be done; probably contains more bugs
I'm not at all sure that it will be faster than what you currently have.
It sure might be
because you'd remove most of that translation layer calls.
> Which do you favour or do you have other suggestions?
I'd say check that space-filled approach. It should work one way or
More information about the Python-list