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 秒であった。やはり,理論値よりは長い。
※コメント投稿者のブログIDはブログ作成者のみに通知されます