File failed to load: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/extensions/TeX/AmsMath.js

March 31, 2013

Pythonの辞書をvalue値でソートするコードの実行時間の比較

get,lambda,itemgetter,zipを使ったvalue値でのソートを比較してみた.
以下コード.

import random
def sort_test():
a = [random.random() for i in range(100)]
b = [random.random() for i in range(100)]
c = dict(zip(a, b))
sorted(c, key=c.get)
view raw get.py hosted with ❤ by GitHub
import random
import operator
def sort_test():
a = [random.random() for i in range(100)]
b = [random.random() for i in range(100)]
c = dict(zip(a, b))
sorted(c.iteritems(), key=operator.itemgetter(1))
view raw itemgetter.py hosted with ❤ by GitHub
import random
def sort_test():
a = [random.random() for i in range(100)]
b = [random.random() for i in range(100)]
c = dict(zip(a, b))
sorted(c.items(), key=lambda x:x[1])
view raw lamb.py hosted with ❤ by GitHub
import random
def sort_test():
a = [random.random() for i in range(100)]
b = [random.random() for i in range(100)]
c = dict(zip(a, b))
d = zip(c.values(), c.keys())
sorted(d)
view raw zip.py hosted with ❤ by GitHub


timeitで計測.

>>> import timeit
>>> timeit.timeit(stmt='get.sort_test()', setup='import get', number=10000)
0.6642911434173584
>>> timeit.timeit(stmt='itemgetter.sort_test()', setup='import itemgetter', number=10000)
0.6961650848388672
>>> timeit.timeit(stmt='zip.sort_test()', setup='import zip', number=10000)
0.6995840072631836
>>> timeit.timeit(stmt='lamb.sort_test()', setup='import lamb', number=10000)
0.7502970695495605

ただし
  • zipの場合(value, key)のリストになる
  • getの場合keyのリストになる(value値は返さない)
に注意.

よく見かけるのはlambdaを使うものだが,同じ結果を得たかったらoperator.itemgetterを使うほうが少し早い.上位だけ取ってきたいときはgetが早いかも.

他にもやり方があるだろうか.

No comments:

Post a Comment