Why is dictionary.keys() a list and not a set?

Fredrik Lundh fredrik at pythonware.com
Thu Nov 24 09:54:36 CET 2005

bonono at gmail.com wrote:

> I know that is a single list of tuples, I mean that can be used as
> well.
> for k, _ in d.items(): print k
> for _, v in d.items(): print v
> for k in d.keys(): print k
> for v in d.values(): print v
> Would there be a noticeable performance difference ?

Sloppy use of print statements is a great way to produce misleading
benchmarks [1], since the time it takes to print lots of stuff tends to
overshadow the actual algorithm (for bonus points, print to a terminal
window, and use "time" to measure performance, so you get startup
times as well).  If you don't necessarily want to print all the stuff, my
original assertion still holds:

    "creating a list full of tuples just to pull them apart and throw
    them all away isn't exactly the most efficient way to do things"

Consider a dictionary with one million items.  The following operations

    k = d.keys()
    v = d.values()

creates two list objects, while

    i = d.items()

creates just over one million objects.  In your "equivalent" example,
you're calling d.items() twice to produce two million objects, none
of which you really care about.


1) careful use of timeit and generator expressions is another one:
http://online.effbot.org/2005_01_01_archive.htm#20050125 (code)
http://online.effbot.org/2005_01_01_archive.htm#20050127 (explanation)

More information about the Python-list mailing list