読者です 読者をやめる 読者になる 読者になる

何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

Pythonのソートキーに何を渡すべきか

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モジュールを使おう。