イナズマの日記

こんにちは。

Julia のメリットとデメリット

Julia を書いているとどういうメリットがあるかを聞かれることが多いので,Python を始めとする他言語と比較した時のメリットやデメリットを書きます.しかし,「for文が速い」みたいな月並みなことや「1/2 を 2\1 と記述できる」などのような役立った試しがないようなことは書きません. 当方 Julia,Python ともにエアプなので,こういう構文・機能を使えば便利だよ.みたいなものがあったら教えてくださると幸いです.

メリットとデメリット共に発見次第追記していく予定です.

メリット

Dot 構文

f.(x)みたいなやつです.x が配列などの時に x の各要素に関数 f を適用します. Python では map 関数を用いることにより同様のことをできますが,f の引数が複数あったりすると面倒です. 例えば,

def f(x, y):
    return x + y

を用いて,配列 (リスト) L の要素すべてを 10 増やしたいとします.

map(lambda i : f(i, 10), L)

Python だとこのようになりますが,Julia だと

f(x, y) = x+y
f.(i, 10)

と簡潔になります.

このDot構文は演算子にも適用できて,要素同士の演算が 「.==」 や 「.+」などでスッとできます.

引数の値を後ろの引数で使える

Python では

def f(x, y=x+10):

のような関数は宣言できませんが,Juliaでは

function f(x, y=x+10)

のような宣言ができます. 割と便利です.

パッケージ管理ツールで悩まない

Python はpipenv や poetryなどたくさんのツールがありますが,Julia は言語がデフォルトで持っているので選択の余地がありません,多分.

デメリット

for文でエラーが生まれやすい

for i in l
end

でfor文が書けますが,lがInt型でも動いてしまいます. 例えばPythonだとlがIntだとエラーが出てくれます.

日本語の情報が少ない

頑張って英語を読みましょう.そして我々が日本語で情報発信をやっていきましょう. もしかしたら英語の情報も Python などと比べると少ないかもです.

引数の名前を指定した呼び出しが不便

Pythonでは任意の引数を名前を指定して呼び出せます.

f(x=10, y=10)

Julia ではこれはできなくて,名前を付けて呼び出すには

function f(x; y)

のようにあらかじめ宣言しておかなければしなければなりません.このように宣言すると,セミコロンの後の引数のみ名前を付けて呼び出せます. しかしこの宣言だと,今度は必ず引数の名前を指定しなくてはならないので不便です.

precompile をする必要がある

例えばJupyterでカーネルのリスタートするたびに,各ライブラリの precompile が走り,待つ必要があります. precompile のおかげで高速になるため仕方ないですが,速度が要求されない小規模なシミュレーションなどをする際は別言語を使ったほうが良いかもです. 結構待つものの,噂によると Julia 0.6 で大幅に高速化されるらしいです.

プログラムの強制終了に時間がかかる場合がある

自分の環境のせいかもしれませんが,Jupyter の Interrupt the kernel をクリックしてもすぐにプログラムが止まらない場合があります. 連打すると止まる場合がありますが,勝手にカーネルがリスタートしていたりします.

module の import が遅いがち

Julia でモジュールを利用するときは

using package_name

と書くのですが,precompile が無くてもなんか遅いです.なんででしょう.

出力が遅い

例えば

x = 1
for i in 1:N
  x += i
  println(x)
end

などと書くと,for文が終わってから出力されたりします.なんででしょう.