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