はじめに
データ分析や機械学習などに利用できるプログラムとして、Juliaがあると知った。
以下3点のメリットから今後利用することがあるかもしれないので、備忘録として初歩的なことから欲しかった資料をまとめていく。
[1]Pythonと同じようにライブラリを利用できる
[2]実行速度がC言語よりも速い
[3]PythonやC言語と連携することもできる
実行環境
参考資料[1]で構築したVSCにおけるWSL2で実行している。
PythonCall / juliacall 採用の理由
実行速度が速いJuliaによる計算処理部分の実行を想定し、PythonとJuliaを連携するためのパッケージ・ライブラリとして、PythonCall・juliacallを利用した。
PyJuliaを利用した事例もあるが、Pyjulia実行用の環境整備に手間がかかることに加え、自分のJuliaとのバージョン差異による警告メッセージが表示され続けてしまうため、利用を控えた。Pyjuliaは過去作成されたものなので、ライブラリ自体が古いJuliaのための記載があるらしい。参考資料[2]にある公式情報でも、Python-Julia間の連携のパッケージ・ライブラリはPythonCallを推奨している。
モジュール・ライブラリ準備
Julia
Julia側でも予めインストールする必要があり、PythonCallが導入されている必要がある。
using Pkg
Pkg.add("PythonCall")
python
python==3.12.8のCondaによる仮想環境上で、以下のライブラリをインストールした。
filelock==3.18.0
juliacall==0.9.24
juliapkg==0.1.16
semver==3.0.4
setuptools==75.8.0
wheel==0.45.1
検証したプログラム
構造
.juliaにある2つのプログラムについて、call.pyから呼び出す。
./
├─.julia
| └─test.jl
| └─test2.jl
└─.python
└─call.py
プログラム
function calc(x)
y = 10
result = x * y
return result
end
function array()
arr = [1,3,5]
return arr
end
function message()
message = "Hello World"
return message
end
function dict()
books = Dict{String, String}(
"ハリー・ポッター" => "ファンタジー",
"ドラえもん" => "漫画",
)
return books
end
from juliacall import Main as jl
import os
# Juliaに渡すための .jl ファイルの絶対パスを取得
jl_file = os.path.abspath("../julia/test.jl").replace("\\", "/")
jl_file2 = os.path.abspath("../julia/test2.jl").replace("\\", "/")
# Juliaで include
jl.seval(f'include("{jl_file}")')
jl.seval(f'include("{jl_file2}")')
# 関数呼び出し
numeric = jl.calc(5)
array = jl.array()
dictionary = jl.dict()
message = jl.message()
print(f"numeric = {numeric} ({type(numeric)})")
print(f"array = {array} ({type(array)})")
print(f"dictionary = {dictionary} ({type(dictionary)})")
print(f"message = {message} ({type(message)})")
結果
PythonからJuliaを呼び出すことに成功し,以下2点が判明した。
①関数を呼び出すにあたり、名前が重複していない限りは単純に関数名を指定するだけで利用することができている。
※複数ファイルで関数名が重複する場合、Julia側でモジュール化する必要があるらしいが、関数名を別名にすることで避けることができるので、今回は試していない。
②jl.sevalで呼び出すJuliaファイルについて、使用する関数などの順番に依存していない。
※複数ファイルで同一関数がある場合、最後に呼び出したものが適用されるらしい。
③Juliaで実行した結果をPython側に取得しているが、Pythonに存在しない型の場合はJuliaの型として取得されてしまっているので、Python側で利用する際に型修正が必要。
参考資料
[1]svoboda, 『[Julia]VSCにおけるWSL2でのJulia 環境構築~サンプルコード実行まで』, https://qiita.com/svoboda/items/6a0ad624bc58a354edb3
[2]MilesCranmer, 『JuliaPy/pyjulia: python interface to julia』, https://github.com/JuliaPy/pyjulia?tab=readme-ov-file
[3]cjdoris, 『JuliaPy/PythonCall.jl』, https://github.com/JuliaPy/PythonCall.jl
[4]Rahban1, 『The Julia module PythonCall』, https://juliapy.github.io/PythonCall.jl/stable/pythoncall/#Installation
[5]Krypf(Krypf), 『【Julia】 基礎: 型』, https://qiita.com/Krypf/items/145ad24911ca51117e29#7-array-%E5%9E%8B