ここでは、それぞれを単独で呼んだ場合の速度と、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 件のコメント:
コメントを投稿