[Urwid] Optimize urwid

Ian Ward ian at excess.org
Fri Dec 29 09:43:14 EST 2006

Victor Stinner wrote:
> ====================== 8< ========================================
> def _get_width( o ):
>     global widths
>     if o == 0xe or o == 0xf:
>         return 0
>     for num, wid in widths:
>         if o <= num:
>             return wid
>     return 1
> def get_width( o ):
>     """Return the screen column width for unicode ordinal o."""
>     global _get_width_cache
>     if o not in _get_width_cache:
>         _get_width_cache[o] = _get_width(o)
>     return _get_width_cache[o]
> ====================== 8< ========================================
> In my program, the cache has 71 entries. That's small ;-)

That's madness! :-)  Instead of storing the entire string we could store 
either a hash of the string or use weakrefs to the strings.  But I 
suspect that none of these solutions will be faster than just 
calculating the width in C.

Also, this patch might help for your situation:

It assumes length==width when all the characters in the string are 
"simple" (as defined by a regular expression)

> For calc_width():
>  * avoid it? (use it only when it's needed)

some avoidance is done in https://excess.org/urwid/changeset/48

>  * use cache? (sound complex)
>  * only accept unicode
> Manipulate UTF-8 is complex. In general, it would be a better idea to only 
> store Unicode string, and convert to UTF-8 when text is written in the 
> terminal.

Yes, that is the recommended approach when writing Python programs.  I 
chose to be more accepting, since I'm writing a library for other 
programmers to use.

In Urwid I accept either locale-dependent strings (to support EUC-*, 
GBK* etc.) or unicode strings.  I don't want to make a special case that 
says "this program must only use unicode strings if the detected 
encoding is UTF-8".

> But I just proposed "micro-optimization". To really improve urwid, we have to 
> implement:
>   http://excess.org/urwid/ticket/1
>   Partial screen updates

Indeed.  This one will have the biggest impact, but it will also hide 
some bits of code that are really slow.  I'll have to include an option 
to turn it off for profiling Urwid.

> And also:
>   http://excess.org/urwid/ticket/2
>   C code for performance critical sections

I believe that Rebecca Breu has done some work on this.  I hope she 
finds some time to post her work, I'd like to try it out.


More information about the Urwid mailing list