Hi,

I needed to create a cache of date and time objects and I wondered what was the 
best way to handle the cache.  For comparison I put together 
the following test:

<file="iforkey.py">
import datetime
import random
import timeit

ranges = [datetime.datetime(2011,01, random.randint(1, 31)) for i in 
xrange(1000)]

def ifdict():
    cache = {}
    b = []
    for i in ranges:
        key = i.day
        if key in cache:
            b.append(cache[key])
        else:
            date = i.date()
            cache[key] = date
            b.append(date)

def keydict():
    cache = {}
    b = []
    for i in ranges:
        key = i.day
        try:
            b.append(cache[key])
        except KeyError:
            date = i.date()
            cache[key] = date
            b.append(date)

def defaultdict():
    cache = {}
    b= []
    for i in ranges:
        b.append(cache.setdefault(i, i.date()))

print "ifdict:", timeit.repeat("ifdict()", "from __main__ import ifdict", 
number=10000)
print "keydict:", timeit.repeat("keydict()", "from __main__ import keydict", 
number=10000)
print "defaultdict:", timeit.repeat("defaultdict()", "from __main__ import 
defaultdict", number=10000)
</file>

# python iforfile.py
ifdict: [2.432887077331543, 2.4002890586853027, 2.397233009338379]
keydict: [2.3483030796051025, 2.358638048171997, 2.314802885055542]
defaultdict: [3.5384328365325928, 3.5329859256744385, 3.5728111267089844]

# pypy iforfile.py      (pypy 1.5)
ifdict: [0.8129069805145264, 0.74648118019104, 0.7432689666748047]
keydict: [0.5187451839447021, 0.4662129878997803, 0.4504108428955078]
defaultdict: [37.98510789871216, 37.859113931655884, 37.92770600318909]

Pypy displays significant slowdown in the defaultdict function, otherwise 
displays its usual speedup.  To check what is the cause I replaced i.date() 
with i.day and found no major difference in times.  It appears dict.setdefault 
(or it's interaction with jit) is causing a slow down.  

Regards

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
pypy-dev mailing list
pypy-dev@python.org
http://mail.python.org/mailman/listinfo/pypy-dev

Reply via email to