Last active
August 29, 2015 14:00
-
-
Save yuitest/c439cc6da8013917b00a to your computer and use it in GitHub Desktop.
タプルから辞書を作るときのパフォーマンス。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
('todict1', 2.637644052505493) | |
('todict2', 2.0221450328826904) | |
('todict3', 3.7830700874328613) | |
('todict4', 2.580557107925415) | |
('todict5', 2.2164390087127686) | |
('todict6', 2.159787178039551) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
result.txt は手元の Mac で測定です。厳密な測定方法ではないですし、環境情報は気が向いた時にかきます。