Skip to content

Instantly share code, notes, and snippets.

@daler
Created May 15, 2013 23:11
Show Gist options
  • Save daler/5588154 to your computer and use it in GitHub Desktop.
Save daler/5588154 to your computer and use it in GitHub Desktop.
profiling different flavors of dictionary implementations
import sys
from gffutils.helpers import DefaultOrderedDict
from collections import defaultdict
from collections import OrderedDict
import random
kind = sys.argv[1]
nlines = 200000
nkeys = 5
vals_per_key = 3
seen = set()
order = []
def dictupdate(d, k, v, seen, order):
"""
Append value `v` to list at key `k` in dict `d`.
"""
val = d.setdefault(k, [])
val.append(v)
return seen, order
def defaultupdate(d, k, v, seen, order):
"""
Append value `v` to list at key `k` in dict `d`.
"""
d[k].append(v)
return seen, order
def naiveorderupdate(d, k, v, seen, order):
defaultupdate(d, k, v, seen, order)
if k not in seen:
seen.update([k])
order.append(k)
return seen, order
lookup = {
'dict': (lambda: dict(), dictupdate),
'defaultordered': (lambda: DefaultOrderedDict(list), defaultupdate),
'default': (lambda: defaultdict(list), defaultupdate),
'ordered': (lambda: OrderedDict(), dictupdate),
'naiveordered': (lambda: defaultdict(list), naiveorderupdate),
}
func, update = lookup[kind]
for line in range(nlines):
d = func()
seen = set()
order = []
for i in range(nkeys):
for j in range(vals_per_key):
seen, order = update(d, i, j, seen, order)
# check at least the last created dict to make sure it's correct
assert dict(d) == {0: [0, 1, 2], 1: [0, 1, 2], 2: [0, 1, 2], 3: [0, 1, 2], 4: [0, 1, 2]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment