I was glad to see your post showing how to run a list of functions through the timer. That's a nice way to do it! You better slip some square brackets into your definition of d though:
d = dict( [((i,i,i), i) for i in range(1000)])
In Python 2.4 they are not needed. For earlier versions, you are right. (((i,i,i), i) for i in range(1000)) is a generator expression. It's value is a generator object that supports the iterator protocol.
>>> g=(((i,i,i), i) for i in range(1000)) >>> g <generator object at 0x008D7198> >>> g.next() ((0, 0, 0), 0) >>> g.next() ((1, 1, 1), 1)
In general, if you replace the [] of a list comprehensions with () you will get a generator comprehension. The () are required but syntactically they can be part of the function call syntax - you don't have to add another () if one is present.
BTW a note about timing for optimization - it is important to do your timing on the same Python version that you will deploy with; there have been significant speedups in portions of Python 2.4 and 2.3. For example list comprehension has gotten much faster.
Kent
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor