[CentralOH] Syntactic Sugar (or sacharine)?

Eric Floehr eric at intellovations.com
Fri Aug 12 19:34:41 CEST 2011


Brandon

> An interesting hypothesis!  You should run a test with the "timeit"
> module to see whether it is truly faster.
>
> My guess is that it is *not* actually faster, because all of the strings
> that appear as literals in your Python code are "interned" strings - no
> matter how many times the literal string 'min' appears in your program,
> CPython creates only a single string object that gets used over and
> over.  And interned strings are, like functions, compared by identity -
> the check for d['min'] will, just like d[min], be reduced immediately to
> an extremely fast pointer comparison operation.

So I would think there are two drivers for time: hash generation and
hash lookup.  I don't know function object hashes work, but I believe
that string hashes are cached, and as you mentioned, strings are
immutable in Python.

So I ran some timeit tests, and consistently the function key lookup
is slower than the string key lookup:

>>> timeit.Timer("d['min']", "d = { min: 1, 'min': 2 }").timeit(100000000)
4.2156741619110107
>>> timeit.Timer("d[min]", "d = { min: 1, 'min': 2 }").timeit(100000000)
5.7933530807495117

The situation isn't much different for locally created classes:

timeit.Timer("d[Timer]", "d = { Timer: 1, 'min': 2 }").timeit(100000000)
5.3071229457855225

My guess as to the reason is that you have *more* steps in a class or
function hash lookup.  You first have to take the name, find it in the
local scope, then lookup the __hash__ function on the object, and then
make a call to the __hash__() function on the object.  Whereas with a
string, because they are special and highly optimized, you just do a
lookup on the string table and get the hash, without the need for a
function lookup and function call.

Not that any of this matters unless you are in a tight loop with 100's
of millions of lookups, but it's fun to ponder.

Cheers,
Eric






>
> But run timeit anyway, because I could be wrong! :)
>
> --
> Brandon Craig Rhodes   brandon at rhodesmill.org   http://rhodesmill.org/brandon
> _______________________________________________
> CentralOH mailing list
> CentralOH at python.org
> http://mail.python.org/mailman/listinfo/centraloh
>


More information about the CentralOH mailing list