[Python-3000] Iterators for dict keys, values, and items == annoying :)

skip at pobox.com skip at pobox.com
Fri Mar 24 15:41:37 CET 2006


    Alex> Not sure what's a "small dict" in your world -- here, for example:

I would say "small" for us is typically fewer than ten keys.  We rarely have
dictionaries with dozens or hundreds of keys.

    Alex> python2.4 -mtimeit -s'd=dict.fromkeys(range(23))' 'for k, v in d.iteritems(): pass'
    Alex> 100000 loops, best of 3: 2.81 usec per loop

    Alex> python2.4 -mtimeit -s'd=dict.fromkeys(range(23))' 'for k, v in d.items(): pass'
    Alex> 100000 loops, best of 3: 4.82 usec per loop

We're still on 2.3 at work.  (All the people who have begun using
iteritems() have never used 2.4.)  Running your tests w/ 2.3 I get:

    ink:% timeit -s'd=dict.fromkeys(range(23))' 'for k, v in d.items(): pass'
    100000 loops, best of 3: 7.16 usec per loop
    ink:% type python
    python is hashed (/opt/lang/bin/python)
    ink:% timeit -s'd=dict.fromkeys(range(23))' 'for k, v in d.iteritems(): pass'
    100000 loops, best of 3: 6.83 usec per loop

Hardly seems worth the effort to type the extra four letters.  In fact, just
iterating over the dict's keys and assigning to v (my personally preferred
idiom) is faster:

    ink:% timeit -s'd=dict.fromkeys(range(23))' 'for k in d: v=d[k]'
    100000 loops, best of 3: 5.03 usec per loop

Sticking the 2.4 directory in front of PATH, I get:

    ink:% timeit -s'd=dict.fromkeys(range(23))' 'for k, v in d.items(): pass'
    100000 loops, best of 3: 6.49 usec per loop 
    ink:% timeit -s'd=dict.fromkeys(range(23))' 'for k, v in d.iteritems(): pass'
    100000 loops, best of 3: 4.16 usec per loop
    ink:% timeit -s'd=dict.fromkeys(range(23))' 'for k in d: v = d[k]' 100000
    loops, best of 3: 4.58 usec per loop

Not as dramatic an improvement as you saw, but yes, I'm surprised that
iteritems() is faster than items().  I stand corrected.

Thx,

Skip


More information about the Python-3000 mailing list