ごきげんよう!
データサイエンスコースのYukariです!
今回は今年私が触り始めた比較的新しいプログラミング言語、Juliaについてお話したいと思います。Pythonのような書きやすさ、Cのような処理速度、他にも様々なプログラミング言語のいとこ取りをした言語と言われています。
はじめに
Juliaの概要
Julia言語は数値計算と科学技術計算向けに設計されたプログラミング言語です。ユーザーフレンドリーな構文、多重ディスパッチ、およびJIT(Just-In-Time)コンパイラによる高速な実行速度が特徴で、データサイエンス、機械学習、数値シミュレーションなどの領域で活用されています。
Juliaのインストール方法
Juliaの公式サイトのダウンロードページよりダウンロード可能です!
Windows, mac, Linuxそれぞれに対応しているのでお使いのOSに合わせてリンクを踏んでください。(exeファイルがダウンロードされるので、ファイルを開いてインストーラーを起動させてください。)
Julia構文紹介
Juliaは基本的にPythonと書き方が似ているのですが、あなたこの書き方OKしてくれるのね!と思ったものをいくつかご紹介します。
行列
Juliaでは多次元配列は行列として扱われます。試しに二次元配列のコードを書いてみましょう。
#Python
import numpy as np
a = np.array([[1, 2, 3],[4, 5, 6]])
#Julia
a = [1 2 3; 4 5 6]
こう見るとPythonとの差は歴然ですね。とってもシンプル!
Unicode文字
JuliaではデフォルトでUnicode文字がサポートされているだけでなく、変数や関数名としても使用できます。
π #\pi
#output
π = 3.1415926535897...
円周率 = π
#output
π = 3.1415926535897...
半径 =3.0
円周率* 半径^2
#output
28.274333882308138
ギリシャ文字ももちろん使えるので、これなら数式をコーディングする際可読性が上がりそうですね!
(日本語を変数とするのに少々違和感があるのは否めませんが…)
以下にJuliaでのUnicode文字入力方法に関するドキュメントを載せるのでご興味ある方はどうぞ↓
多重ディスパッチ
多重ディスパッチは、関数が引数の型によって振る舞いを変える仕組みです。
これにより、柔軟性がありながらも高性能なコードを書くことができます。
以下に、Julia言語で多重ディスパッチを使った簡単な例を示します。
まずは簡単な関数を定義します。ここでは、greet
という関数があり、引数の型によって異なる挨拶を返すようになっています。
# 多重ディスパッチを使用した関数の定義
greet(x::String, y::String) = println("Hello $x and $y !")
greet(x::String) = println("Hello $x !")
greet(x::Int, y::Int) = println("I still can't believe that you're just $x and $y years old!")
# 関数の呼び出し
greet("Alice", "Bob") # Hello Alice and Bob!
greet("Charlie") # Hello Charlie!
greet(19, 20) # I still can't believe that you're just 19 and 20 years old!
#output
Hello Alice and Bob !
Hello Charlie !
I still can't believe that you're just 19 and 20 years old!
この例では、greet
関数が異なる引数の型に対して異なる実装を持っています。Juliaは実行時に引数の型を見て、対応する関数実装を選択します。
多重ディスパッチの特徴は、同じ関数名で引数の型によって異なる振る舞いをすることができる点です。これにより、コードの再利用性が高まり、柔軟な設計が可能になります。
Juliaの多重ディスパッチは、関数のシグネチャ(引数の型や数)に基づいて動的に解決されるため、高いパフォーマンスが得られるという利点もあります。
Julia vs Python処理速度比較実験
Juliaが注目された主たる理由はその処理速度の速さです。動的型付け言語であるにも関わらず、JIT(Just-In-Time)コンパイラをしているのでシンプルな構文かつ高速な処理を実現しています。
Pythonの競合として比較されがちですが、試しにここでも速度比較をやってみましょう。
以下はfor文で単純に1から10^7までの整数を加算してその処理時間を計測するコードです。同じ処理をPythonとJuliaそれぞれで行います。
#Python
import time
def time_consuming_addition_python():
result = 0
n = 10**7
start_time = time.time()
for i in range(1, n + 1):
result += i
end_time = time.time()
elapsed_time = end_time - start_time
return result, elapsed_time
result_python, elapsed_time_python = time_consuming_addition_python()
print(f"{elapsed_time_python} seconds")
print(f"Python Result: {result_python}")
結果は…
#output
0.9219114780426025 seconds
Python Result: 50000005000000 #加算結果
一方でJuliaはというと…
#Julia
function time_consuming_addition_julia()
result = 0
n = 10^7
@time begin
for i in 1:n
result += i
end
end
return result
end
result_julia = time_consuming_addition_julia()
println("Julia Result: $result_julia")
#output
0.008888 seconds
Julia Result: 50000005000000 #加算結果
Wow! たしかにJuliaの方が速いですね。
(今回はただただ面倒な計算をさせただけなので、特有のライブラリを用いた別の処理をさせたりすると速度の優劣が反転する可能性もあります。必ずしも一概なものではないのでご注意下さい。)
処理速度が速くて、書きやすくて、可読性が高くて、数値計算得意で…
なんて夢のような言語!と思ってしまいますが、様々な言語の影響を受けて誕生しただけあって、使用人口がそこまで多くなく、Julia用のライブラリが少ないという面もあります。
ただし、後者に関していうと、Juliaは互換性に優れた言語なのでPythonのライブラリを呼んできて使用することが出来たりします。
Why They Created Julia?
そんな素敵な言語、Juliaは2009年にMITで誕生し、2012年に公表されました。
元々Python、MATLAB、Rなどの数値計算・AI向きの言語を使っていた人々が既存の言語に満足しきれず、貪欲さのままに作り出した言語がJuliaなのです。
公表当時、開発者らはこんな言葉を残しています。
We are greedy: we want more.
We want a language that's open source, with a liberal license. We want the speed of C with the dynamism of Ruby. We want a language that's homoiconic, with true macros like Lisp, but with obvious, familiar mathematical notation like Matlab. We want something as usable for general programming as Python, as easy for statistics as R, as natural for string processing as Perl, as powerful for linear algebra as Matlab, as good at gluing programs together as the shell. Something that is dirt simple to learn, yet keeps the most serious hackers happy. We want it interactive and we want it compiled.
(Did we mention it should be as fast as C?)
訳:
私たちは貪欲です。もっと欲しいのです。
私たちはオープンソースで、自由なライセンスを持つ言語が欲しい。Cのような高速さとRubyのダイナミズムが欲しい。Lispのような本物のマクロとともに、Matlabのような明白で馴染みのある数学的な表記が欲しい。Pythonのような汎用性があり、Rのような統計処理も簡単な言語が欲しい。Perlのような文字列処理に自然であり、Matlabのように線形代数に強力な言語が欲しい。複数のプログラムを結びつけるのが得意なshellのような言語が欲しい。学びやすく、しかしハッカーたちも満足できるものが欲しい。対話的であり、かつコンパイルも可能なものが欲しい。
(Cのように高速な、はもう言いましたっけ?)
最後に
今回はJuliaについて紹介させていただきました。Juliaについて調査している中で、思ったよりもJuliaライブラリが多かったこと、公式ドキュメントの充実度が高いことに少し驚きました。あらゆる面で貪欲な言語、活用先を考えるのは楽しいものですね。今後はJulia特有のライブラリを触って記録もしていけたらと思います。
最後までご覧いただきありがとうございました。
それではごきげんよう!