Skip to content

Instantly share code, notes, and snippets.

@yuitest
Last active August 29, 2015 14:00
Show Gist options
  • Save yuitest/c439cc6da8013917b00a to your computer and use it in GitHub Desktop.
Save yuitest/c439cc6da8013917b00a to your computer and use it in GitHub Desktop.
タプルから辞書を作るときのパフォーマンス。
('todict1', 2.637644052505493)
('todict2', 2.0221450328826904)
('todict3', 3.7830700874328613)
('todict4', 2.580557107925415)
('todict5', 2.2164390087127686)
('todict6', 2.159787178039551)
# coding: utf-8
from collections import defaultdict, deque
L = [
('a', 1),
('b', 2),
('c', 3),
('a', 4),
('c', 5),
]
# から
d = {
'a': [1, 4],
'b': [2],
'c': [3, 5],
}
# を作りたいとする。
def todict1(L):
d = {}
for k, v in L:
if k not in d:
d[k] = []
d[k].append(v)
return d
# defaultdict を使ったオサレな作り方。
def todict2(L):
d = defaultdict(list)
for k, v in L:
d[k].append(v)
return dict(d)
# reduce とか使うと less Pythonic
def todict3(L):
return dict(
reduce(lambda d, (k, v): d[k].append(v) or d, L, defaultdict(list)))
# おもむろにジェネレータ式
def todict4(L):
d = defaultdict(list)
for _ in (d[k].append(v) for k, v in L):
pass
return dict(d)
# deque は挿入が早いと聞いて
def todict5(L):
d = defaultdict(deque)
for k, v in L:
d[k].append(v)
return dict((k, list(v)) for k, v in d.iteritems())
def todict6(L):
d = defaultdict(deque)
for k, v in L:
d[k].append(v)
return dict((k, list(v)) for k, v in d.iteritems())
import random
import timeit
sampledata = [
(random.randint(0, 32), random.randint(0, 128))
for _ in xrange(10000)]
for name in ('todict1', 'todict2', 'todict3', 'todict4', 'todict5', 'todict6'):
setup = 'from __main__ import sampledata, {} as factory'.format(name)
print(name, timeit.timeit('factory(sampledata)', setup, number=1000))
@yuitest
Copy link
Author

yuitest commented May 5, 2014

result.txt は手元の Mac で測定です。厳密な測定方法ではないですし、環境情報は気が向いた時にかきます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment