こんにちは、モリカトロン株式会社・AIエンジニアの舒(ジョ)と申します。
最近、社内の研究で経路探索のアルゴリズムを実装していたのですが、Pythonで実装すると非常に遅かったので、Pythonに似ているけどより高速に 処理できそうな「Julia」というプログラミング言語を使って実装しなおすことがありました。
ということで今回は最近使い始めた「Julia」を紹介します。
以下の内容は Windows 環境を想定しています。
Juliaとは
Julia は、高度な計算や数値解析のために開発されたプログラミング言語で、マサチューセッツ工科大学の研究者 Jeff Bezanson らによって2009年に開発され、2012年にオープンソース化されました。
開発者によると、C言語の速さやR言語の統計の扱いやすさ、Perlの自然な文字列処理、Matlabの線形代数など他の言語のいいところだけを組み合わせることを目指した言語だそうです。
Python との大きな違いはプログラムを JIT コンパイルするところで、これにより Python よりも高速な処理に期待できます。
Juliaのインストール
下記の公式サイトにアクセスしてJuliaのインストーラーをダウンロードできます。 自分が使っているVersionはVersion 1.6.5です。
インストール後、インストールしたフォルダのパスなどを環境変数に設定して下さい。 (例)
JULIA_PATH="C:(Juliaインストールフォルダ)" PATH=%JULIA_PATH%\bin;%PATH%
JuliaのショートカットをダブルクリックしてJuliaを起動します。
以下のようにJuliaのプロンプト画面が起動しますので、ここにコマンドを入力して処理を実行させます。
VS Code上で開発環境を整える
コマンドプロンプトで直接処理を記述するだけというのは扱いづらいので、VSCodeを使った開発環境も構築しました。
Julia拡張を導入する
- VS CodeでJuliaを扱うための拡張機能をインストール
- VS Code内、左のバーから拡張機能をクリックし、「Julia」で検索を行うと、画像のような拡張機能が見つかるので、こちらをインストール
- 設定ページ内にExexutable Pathという項目があるので、こちらに先ほどインストールしたJuliaのpathを設定
- VS Code上で Test.jl を開いた状態で
Shift+Enter
を押す( VS Code上でREPLというJuliaのコマンドラインが現れ、実行結果が表示されます。)
パッケージの導入方法
JuliaにはPythonにおけるpipのようなパッケージ管理の機能が用意されています。 Juliaでプログラミングする際にはほぼ必須の機能なのでこれについても軽く紹介しておきます。
- Juliaを起動
- 「
using Pkg
」と入力して、Pkgツールを呼び出す - 「
kg.add("package")
」のように入力して指定のパッケージをインストール
パラメータ | 詳細 |
---|---|
Pkg.add( package ) | 指定された登録パッケージをダウンロードしてインストールします。 |
Pkg.checkout( package branch ) | 指定された登録済みパッケージのブランチを調べてください。 branchはオプションで、デフォルトは"master"です。 |
Pkg.clone( url ) | 指定されたURLのGitリポジトリをパッケージとしてパッケージ化します。 |
Pkg.dir( package ) | 指定されたパッケージのディスク上の場所を取得します。 |
Pkg.pin( package version ) | 指定したバージョンにパッケージを残します。 versionはオプションで、デフォルトはパッケージの現在のバージョンです。 |
Pkg.rm( package ) | 指定されたパッケージを必要なパッケージのリストから削除します。 |
PythonとJuliaの連携
PythonではなくJuliaで記述する方が処理が高速になる可能性が高いですが、プログラムのすべてをPythonからJuliaに置き換えるというのは非常に大変な作業になってしまいます。 今まで書いたコードは出来るだけそのまま使い、高速に処理する必要がある部分だけJuliaで記述できる方がありがたいです。
このような場合、pyjuliaというPythonモジュールを使う事で簡単にPythonとJuliaの連携を行うことが可能です。
PythonからJuliaのコードを呼び出すモジュールがpyjuliaで、JuliaからPythonを呼び出すJuliaPyというパッケージもあります。
事前処理
pip install julia
でPyJuliaをインストールpip install julia
Python 上で下記コマンドを実行
import julia julia.install()
PythonからJuliaを呼び出す
呼び出すJuliaのプログラムを用意 (ファイル名は Test.jl )
function test_function(text) println(text) end
Python側プログラムでJuliaのプログラムをインクルードして実行
from julia import Main as jl jl.include("Test.jl") jl.test_function("hello world!") jl.close
このプログラムの実行結果は以下のようになります。
julia> "hello world!"
注意点
マルチスレッドとの相性が悪い
pyjuliaはスレッドセーフではないため、複数のスレッドで使用することが出来ません。
pyinstallerでビルドすることができない
pyinstallerを利用してPythonプログラムを配布しようとする場合にpyjuliaは利用できないようです。
このような場合にはjuliaファイルを別途コンパイルしておき、それをPythonから呼び出すようにする必要があります。
Juliaのソースコードをコンパイルする
先ほど少し書きましたが、Pythonのプログラムを配布したい場合にpyinstallerを使う場合があります。 そういった場合に必要になるJuliaのソースコードのコンパイル方法も紹介しておきます。
Juliaのプログラムを準備
事前に、コンパイルしたいJuliaのプログラムを用意しておきます。 (ファイル名は Test.jl とします)
function test_function(text) println(text) end test_function("hellow world!")
PackageCompilerインストール
次にコンパイラ「PackageCompiler」をインストールします。
- Juliaを起動
using Pkg
と入力して、Pkgツールの呼び出すPkg.add("PackageCompiler")
と入力して、PackageCompilerをインストール
Juliaのソースコードをコンパイルする
- Juliaを起動
pwd()
関数を使用して、作業ディレクトリを確認
作業ディレクトリを変更したい場合は
cd()
関数を使用してディレクトリを変更してくださいjulia> cd("path") # 作業ディレクトリを変更できます
パッケージ化されたファイルのサイズを減らすために、独立した環境を作成
- 上記命令を実行すると、作業ディレクトリに「 Hello 」フォルダが生成されます。
- 上記命令を実行すると、作業ディレクトリに「 Hello 」フォルダが生成されます。
- キーボードの「 ] 」キーを押して、Pkgツールに入ります。
- 環境を先ほど作成した「 Hello 」に切り替えます。
- Pkgの状態で、必要な外部パッケージを「 Hello 」環境に追加します。
作業ディレクトリ\Hello\
以下にある「 Project.toml 」を開き、コンパイル情報を編集
作業ディレクトリ\Hello\src\
以下にある「 Hello.jl 」に、最初に作成した「 Test.jl 」の内容をコピーしてビルド用ファイルを準備ここでは元のすべてのコードを1つの関数の内部に置く必要があります。
Juliaのプロンプト画面に以下のコードを入力してビルドを実行
create_app("pkg_ob_name", "path_name")
- 「
作業ディレクトリ\Hello_build\src\bin\Hello.exe
」が生成されるので、実行を確認
参考
https://qiita.com/syoyo/items/5b8639b206b232984ffa https://github.com/JuliaPy/pyjulia https://qiita.com/ttabata/items/b05bb43d06239f968035 https://qiita.com/ttabata/items/3afc8cef40d1e98a7b17 https://qiita.com/SatoshiTerasaki/items/9d775c294a10c1f2edfe https://www.youtube.com/watch?v=jjJ2xHpxwHg https://www.kimoton.com/entry/20210414/1618372800