裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Python 3.10.0 で JIT コンパイラが動いている?

2021年12月20日 | ブログラミング

JITコンパイラでPythonを高速化する「Pyjion」、バージョン1.0が登場
https://project.nikkeibp.co.jp/idg/atcl/19/00002/00281/

との記事があったが,それとは違うものかもしれないが,何もしなくても JIT コンパイラが動いているようなのだが。

以下の実行例で,np.mean() を 3 回実行しているが,初回は 0.0298 秒だが,2 回目以降は 0.0184 秒になっている。

Python 3.10.0 (v3.10.0:b494f5935c, Oct  4 2021, 14:59:19) [Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.random.seed(123)
>>> x = np.random.normal(50, 10, 100000000)
>>> from time import time
>>> start = time(); m = np.mean(x); print(m, time() - start)
50.000602597052335 0.029835939407348633
>>> start = time(); m = np.mean(x); print(m, time() - start)
50.000602597052335 0.01838517189025879
>>> start = time(); m = np.mean(x); print(m, time() - start)
50.000602597052335 0.018398046493530273

なお,x の長さを 10 倍にして, x = np.random.normal(50, 10, 1000000000) について同じことをやってみると,12.85 秒,14.40 秒,13.35 秒となった。これは,ガーベージコレクションやスワップが多発するために理論的には10倍になるが,遥かに経過時間が長くなっているのであろう。

ちなみに Julia も JIT コンパイラが働くが,

julia> using Random

julia> Random.seed!(123);

julia> @time x = randn(100000000);
  0.241307 seconds (2 allocations: 762.939 MiB, 1.91% gc time)

julia> @time x = x .* 10 .+ 50;
  0.099196 seconds (228.56 k allocations: 775.553 MiB, 2.98% gc time, 26.03% compilation time)

julia> @time mean(x)
  0.052130 seconds (153.62 k allocations: 8.408 MiB, 46.63% compilation time)
50.001400590232656

julia> @time mean(x)
  0.016738 seconds (1 allocation: 16 bytes)
50.001400590232656

julia> @time mean(x)
  0.016801 seconds (1 allocation: 16 bytes)
50.001400590232656

であった。

長さを 10 倍したときにはそれぞれ,17.980272,13.516718,12.985337 秒であった。やはり,理論値よりは長い。

 

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« はっきり言って, | トップ | R, Python, Julia の速度比較... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事