Pythonのリストの中身をソートしたい場合、list.sort()
かsorted()
を使う。
その際に何をキーとしてソートをするかをkey
引数として渡すことができる。
よくある状況として、辞書を含むリストが存在し、辞書の特定のキーの値でソートしたい、という状況である。
import datetime import random import string people = [ { "name": "".join([random.choice(string.ascii_letters) for i in range(10)]), "birthday": datetime.date.fromordinal(random.randint(1, datetime.date.today().toordinal())) } for j in range(10**6) ]
今までは無名函数lambda
でキーを指定していた。
sorted(people, key=lambda x: x.get("birthday"))
最近、ソート HOW TO — Python 3.6.1 ドキュメントを読んでoperator
モジュールの函数を使うと高速にできるという情報を知った。
import operator sorted(people, key=operator.itemgetter("birthday"))
長い物には巻かれろ、ということでソートHOW TOの記述を信じてソートキーにはoperator
モジュールの函数を使おう、と結論付けてもよいが、せっかくなので測定してみよう。
測定方法もtime.time()
の差分ではなくtimeit
を使ってみる。
key_lambda = timeit.timeit('sorted(people, key=lambda x: x.get("birthday"))', number=10, globals=globals()) key_operator = timeit.timeit('sorted(people, key=operator.itemgetter("birthday"))', number=10, globals=globals()) print("Lambda", key_lambda) print("operator", key_operator)
Lambda 13.513277642467928 operator 11.774310869161361
確かにoperator
モジュールの函数の方が速い。
そういうことで、ソートキーにはoperator
モジュールを使おう。