計測は、①変数の読み込み ②変数への書き込み の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 件のコメント:
コメントを投稿