[Python-Dev] Patch to use dict subclasses in eval(), exec

Jeff Epler jepler@unpythonic.net
Tue, 29 Oct 2002 11:18:29 -0600


Here's the lookup-speed script.

num = 1000000
code = """
x = None
r = range(%d)
def builtin_lookup():
    for i in r:
        len; len; len; len
        len; len; len; len
        len; len; len; len
        len; len; len; len

def global_lookup():
    for i in r:
        x; x; x; x
        x; x; x; x
        x; x; x; x
        x; x; x; x

def local_lookup():
    x = None
    for i in r:
        x; x; x; x
        x; x; x; x
        x; x; x; x
        x; x; x; x

def overhead():
    for i in r: pass
""" % num

class D(dict): pass
class E(dict): __getitem__ = lambda s, k: dict.__getitem__(s, k)

print "Timing %d name lookups" % (num*4)
print "%8s %8s %8s %8s %8s" % ("type", "builtin", "global", "local", "overhead")

import time
for dc in dict, D, E:
    d = dc()
    exec code in d
    print "%8s" % dc.__name__,
    for f in ("builtin_lookup()", "global_lookup()", "local_lookup()", "overhead()"):
        t0 = time.time()
        exec f in d
        t1 = time.time()
        print "%8.5f" % (t1-t0),
    print