2019年5月4日

ベンチマーク14 operator.itemgetter と lambda

operator.itemgetter と lambda の動作速度について比較します。
ここでは、それぞれを単独で呼んだ場合の速度と、sorted() の key として指定した場合の速度の、二通りについて比較を行います。


単独で呼ぶ場合のベンチマークのソースコードです。
(呼び出し速度の差を失くすため、計測対象の関数を一旦ローカル変数 f に代入するようにしています)

from operator import itemgetter
from benchmarker import Benchmarker

t = ('Python', 1990, 'Guido')

with Benchmarker(1000000, width=20, cycle=3, extra=1) as bench:
    @bench("itemgetter")
    def _(bm):
        f = itemgetter(1)  # 一旦ローカル変数で受ける
        for _ in bm:
            f(t)

    @bench("lambda")
    def _(bm):
        f = lambda x: x[1]  # 一旦ローカル変数で受ける
        for _ in bm:
            f(t)
測定結果です。
## benchmarker:      release 4.0.1 (for python)
## python version:   3.7.3
## python compiler:  Clang 6.0 (clang-600.0.57)
## python platform:  Darwin-18.5.0-x86_64-i386-64bit
...

## Ranking             real
itemgetter           0.0945  (100.0) ********************
lambda               0.1189  ( 79.5) ****************
劇的と言うほどではありませんが、itemgetter の方が速いようです。





続いて、よく使うと思われる sorted() の key に使用した場合を比較します。

from operator import itemgetter
from benchmarker import Benchmarker

t = (('Python', 1990, 'Guido'), ('Ruby', 1995, 'Matz'), ('Perl', 1987, 'Larry'))

with Benchmarker(1000000, width=20, cycle=3, extra=1) as bench:
    @bench("itemgetter")
    def _(bm):
        f = itemgetter(1)  # 一旦ローカル変数で受ける
        for _ in bm:
            sorted(t, key=f)

    @bench("lambda")
    def _(bm):
        f = lambda x: x[1]  # 一旦ローカル変数で受ける
        for _ in bm:
            sorted(t, key=f)
測定結果です。
## benchmarker:      release 4.0.1 (for python)
## python version:   3.7.3
## python compiler:  Clang 6.0 (clang-600.0.57)
## python platform:  Darwin-18.5.0-x86_64-i386-64bit
...

## Ranking             real
itemgetter           0.4499  (100.0) ********************
lambda               0.5490  ( 81.9) ****************
こちらでも、やはり itemgetter の方が若干速いという結果になりました。

0 件のコメント:

コメントを投稿