※ MATLAB、Python、Scilab、Julia比較ページはこちら。
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/
はじめに
MATLAB,Python,Scilab,Julia比較 その38【ユーザ関数④】を書き直したもの。
性格的にはPythonに近いが、関数を定義する毎にJITコンパイルが走る。
実行時コンパイラ(じっこうじコンパイラ、Just-In-Time Compiler、JITコンパイラ、その都度のコンパイラ)とは、ソフトウェアの実行時にコードのコンパイルを行い実行速度の向上を図るコンパイラのこと。通常のコンパイラはソースコード(あるいは中間コード)から対象CPUの機械語への変換を実行前に事前に行い、これをJITと対比して事前コンパイラ (Ahead-Of-Timeコンパイラ、AOTコンパイラ)と呼ぶ。
Wikipediaより(https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E6%99%82%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)
ユーザ関数(対話モード)
Pythonのように対話モードで記載することも可能。
> function test_func(a,b,c)
x=a+b
y=a-c
return x, y
end
test_func (generic function with 1 method)
> (A,B)=test_func(1,2,3)
(3, -2)
funcionで初めてendで終了。
Pythonと違ってインデントは気にしなくてOK。
見やすさの都合で入れるべきではある。
明示的にreturn文を使わない場合は、最後に更新した変数が戻り値になる。今回のように2変数を戻したい場合は、明示的にreturn文を使うことになる。
関数最後に2変数をを置くことで戻すことも可能。
> function test_func(a,b,c)
x=a+b
y=a-c
x, y
end
test_func (generic function with 1 method)
> (A,B)=test_func(1,2,3)
(3, -2)
ユーザ関数(スクリプトファイル)
スクリプトファイルとして記載する場合も書き方自体は同一。
# a,b,cが引数
# x,yが戻り値
function test_func(a,b,c)
x=a+b
y=a-c
return x, y
end
includeでスクリプトファイルを指定することで、関数が定義される。(このタイミングでJITコンパイルも走る)間違い→(実行時にJITコンパイルが走る)
> include("test.jl")
test_func (generic function with 1 method)
> (A,B)=test_func(1,2,3)
(3, -2)
Juliaの関数が実体を持つタイミングのイメージ
MethodAnalysisというパッケージで関数の実体を参照することができる。
> using MethodAnalysis
> function test_func(a,b,c)
x=a+b
y=a-c
return x, y
end
test_func (generic function with 1 method)
> methodinstances(test_func)
Core.MethodInstance[]
# ↑関数群格納用のコンテナが出来ている状態
> test_func(1, 2, 3)
(3, -2)
> methodinstances(test_func)
1-element Vector{Core.MethodInstance}:
MethodInstance for test_func(::Int64, ::Int64, ::Int64)
# ↑該当引数に合わせた実体がコンパイルされた状態
> test_func(1.0, 2, 3)
(3.0, -2.0)
> methodinstances(test_func)
2-element Vector{Core.MethodInstance}:
MethodInstance for test_func(::Int64, ::Int64, ::Int64)
MethodInstance for test_func(::Float64, ::Int64, ::Int64)
# ↑異なる引数で同一関数を呼ぶと内部の演算も大きく変わるため異なる実体としてコンパイル&コンテナに格納
> test_func(1.0, 2.0, 3)
(3.0, -2.0)
> methodinstances(test_func)
3-element Vector{Core.MethodInstance}:
MethodInstance for test_func(::Int64, ::Int64, ::Int64)
MethodInstance for test_func(::Float64, ::Int64, ::Int64)
MethodInstance for test_func(::Float64, ::Float64, ::Int64)
> test_func(1.0, 2.0, 3.0)
(3.0, -2.0)
> methodinstances(test_func)
4-element Vector{Core.MethodInstance}:
MethodInstance for test_func(::Int64, ::Int64, ::Int64)
MethodInstance for test_func(::Float64, ::Int64, ::Int64)
MethodInstance for test_func(::Float64, ::Float64, ::Int64)
MethodInstance for test_func(::Float64, ::Float64, ::Float64)
>
まとめ
- 雰囲気はPythonに似ている。
- 関数を
(定義した段階)実行した段階でJITコンパイルが走る。 - 対話モード、スクリプトで定義する方法があるが、考え方は一緒。
※ MATLAB、Python、Scilab、Julia比較ページはこちら。
コメント