#julialang #python #mpfr #mpmath #scipy #parallel
Juliaでのpmap函数を使った並列処理を試してみました。
Juliaでは配列 a の各々の要素に函数 f を施した結果を得たければ f.(a) と書くのですが、pbc(f,a) と書くとそれを並列処理してくれる簡単な(手抜きの)函数を書きました。(pbc は parallel broadcast の略のつもり。)
ついでに、mpfrとscipyとmpmathの指数積分函数の比較もしてしまいました。(すでに紹介したようにscipyの指数積分函数が個の中では一番速い。)
並列処理が特に有効なのは f が遅い函数の場合です(特にそういう場合に並列処理をしたくなる)。
mpmathの指数積分函数は遅いので並列処理で4倍ほど速くなった。CPUが4コアなので妥当な数字かも。
並列処理が気軽にできるのは便利だと思いました。
https://gist.github.com/genkuroki/32d4d66fa216411c51b7548a841df4fb
https://github.com/JuliaLang/julia/issues/7089
の stevengj commented on 31 Jan のコメントがすごい!
Juliaで複素函数版の指数積分函数を実装したら、scipyで使われているFORTRANで書かれた指数積分複素函数よりも5~6倍速かったと書いてある!
そのコメントから張られているリンク先が以下。
https://github.com/stevengj/18S096-iap17
https://github.com/stevengj/18S096-iap17/blob/master/pset3/pset3-solutions.ipynb
これは後で確認してみよう。
https://github.com/stevengj/18S096-iap17
の講義録は滅茶苦茶参考なりそうな内容でした。講義の主題はどうも「高速計算」のようです。
そうか、JuliaとgccとPythonの速度比較をやるには、すべてをJuliaから呼び出してやればよかったのか。
https://github.com/stevengj/18S096-iap17/blob/master/lecture1/Boxes-and-registers.ipynb
の最初の部分に、Juliaからgccを呼び出して函数をコンパイルして、それをそのままJuliaで利用する方法が書いてあります。
わざわざ Makefile を書いて試したのはちょっとアホだったかも。
Jupyter notebookの形式になっていた方が取り扱いが便利だった。
複数の言語を一つの言語から自由に利用できるのはやはりとてもよいですね。
(1) Juliaでは、gccを呼び出してCで書かれた函数をコンパイルしてJuliaの函数として利用できる。
(2) JuliaからPythonのライブラリを
using PyCall
@pyimport scipy.special as s
のように書いて利用できる。(SciPyの特殊函数ライブラリ(十分に高速)をこれで利用できる。)
matplotlib.pyplot をJuliaユーザーは最も気楽に使えるplotting backend として利用している。
SymPyもJuliaで利用できる。プログラムを書くときに、多項式やTaylor展開などの面倒な計算をしなければいけないことが結構あるので、これはとてもありがたい。
(3) JuliaではRも呼び出せる。Rのコードも
R"mod <- lm(y ~ X-1)"
のように書いて実行できる。
http://luiarthur.github.io/usingrcall
Rでやった方が楽なことはRですませるというようなことも簡単にできます。
#julialang #specialfunctions #mathNT #primenumbertheorem
https://github.com/JuliaLang/julia/issues/7089
でJuliaに指数積分函数が見当たらないという問題が話題になっていました。
私も、素数定理のグラフを描こうと思って、対数積分函数を探して見付からないことで、指数積分函数も見つからないことに気付いた。
対数積分函数 Li(x) と指数積分函数 Ei(x) の関係は Li(x)=Ei(log(x)).
Li(x) が x 以下の素数の個数と同じオーダーで大きくなというのが素数定理。