2015年11月8日

ベンチマーク1 √2

math.sqrt() について、ベンチマークを計測します。


math.sqrt() を用いて√2の計算を行います。ここで、math.sqrt() へ渡す引数として以下の3パターン用意し、それぞれの処理速度を比較します。

  1. math.sqrt(2)
  2. math.sqrt(2.0)
  3. math.sqrt(float(2))

ベンチマークのソースコードです。
from benchmarker import Benchmarker
import math

with Benchmarker(1000000, cycle=3, extra=1) as bench:

    @bench("int")
    def _(bm):
        for _ in bm:
            math.sqrt(2)

    @bench("float")
    def _(bm):
        for _ in bm:
            math.sqrt(2.0)

    @bench("cast")
    def _(bm):
        for _ in bm:
            math.sqrt(float(2))
計測結果です。
## benchmarker:         release 4.0.1 (for python)
## python version:      3.4.0
## python compiler:     MSC v.1600 32 bit (Intel)
## python platform:     Windows-8-6.2.9200
...

## Ranking      real
float         0.8217  (100.0) ********************
int           1.4161  ( 58.0) ************
cast          2.2811  ( 36.0) *******


計測結果からは以下のことが言えます。
  • float を渡す方が、int を渡すよりも高速
  • 渡す前に自力で float に変換するのは全くの逆効果


この傾向は math.sqrt() に限らず、mathライブラリの多くの関数に当てはまります。
リテラル値を math の関数へ渡す際には、たとえ整数値であっても、math.sqrt(2) ではなく math.sqrt(2.0) のように float で渡す方が高速になるようです。本当にちょっとしたことですけどね。

0 件のコメント:

コメントを投稿