計測は、①変数の読み込み ②変数への書き込み の2種類について行います
まずは、①変数の読み込み を行うベンチマークのソースコードです。
from benchmarker import Benchmarker
global_valiable = 0
with Benchmarker(10000000, cycle=3, extra=1) as bench:
@bench("local")
def _(bm):
local_valiable = 0
for _ in bm:
dummy = local_valiable
@bench("global")
def _(bm):
for _ in bm:
dummy = global_valiable
計測結果です。
## 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 local 1.5814 (100.0) ******************** global 2.1379 ( 74.0) ***************ローカル変数へのアクセスの方が高速のようです。
続いて、②変数への書き込み を行うベンチマークのソースコードです。
from benchmarker import Benchmarker
global_valiable = 0
with Benchmarker(10000000, cycle=3, extra=1) as bench:
@bench("local")
def _(bm):
local_valiable = 0
for _ in bm:
local_valiable = 10
@bench("global")
def _(bm):
global global_valiable
for _ in bm:
global_valiable = 10
計測結果です。
## 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 local 1.5978 (100.0) ******************** global 2.0992 ( 76.1) ***************こちらも、ローカル変数へのアクセスの方が高速のようです。
2つの計測結果から得られる結論は 「ローカル変数へのアクセスの方が、グローバル変数へのアクセスよりも高速である」 とであると言えます。
グローバル変数を変更することは、処理速度以前の問題として、可能な限り排除すべきです。
他方、定数のグローバル変数というのはマジカルナンバーを定義するためによく使われると思います。仮にこのベンチマークのように、何万回もグローバル変数を読み込むのであれば、いったんローカル変数にコピーする、などの工夫があっても良いかと思います。
0 件のコメント:
コメントを投稿