スクラップブック
資料
Julia 言語 MIT License
英語だが公式ドキュメントも Wikibook も非常に充実している。
Juliaデータサイエンス
- Julia をマルチプロセスで実行する場合はコマンドライン引数に使用するコア数を指定する。デフォルトはシングルプロセスのみ。
$ julia -p n
@parallel
付き for は複数のプロセスを使って並列処理を行う。ただしループ内で参照するデータはコピーとなるため副作用のある (状態変更を伴う) 処理は期待した結果にならない。例えばarray = zeros(500) @parallel for i=1:500 arr[i] = i end
- C と FORTRAN、Python のコードが呼び出せる。
- Julia は動的型付き言語だが関数は引数の型を指定できて Int32 と Float64 で異なる実装を持たせることができる。引数の型によって適切な関数の実装を選択することを多重ディスパッチと呼ぶ。
多重ディスパッチは静的型付き言語でいうところのオーバーロードに相当する。ただし動的型付き言語であるため関数の選択は実行時に解決する。Scala で言えば型のパターンマッチを使って以下のような分岐処理を挟んでいるのと同じ。julia> f(a::Int, b::Int) = a + b f (generic function with 1 method) julia> f(a::Float64, b::Float64) = a + b f (generic function with 2 methods) julia> f(1, 1) 2 julia> f(0.5, 0.3) 0.8 julia> f(0.5, 1) ERROR: MethodError: no method matching f(::Float64, ::Int64) Closest candidates are: f(::Float64, ::Float64) at REPL[22]:1 f(::Int64, ::Int64) at REPL[19]:1
動的型付き言語であっても関数/メソッドのインターフェースを区切りとして型検査が行われるのは良いかもしれない。def f(a:Any, b:Any):Any = (a, b) match { case (i1:Int, i2:Int) => f(i1, i2) case (f1:Double, f2:Double) => f(f1, f2) }
- DataFrame は Spark SQL のそれと同じで、データを同じスキーマを持つ複数のタプルとして扱うもの。RDBMS 的に言えばテーブルのようなもの。Array や DataArray は単一の型のみだが DataFrame は列ごとに型と名前を付けられる。ただし Spark の RDD のように I/O や iteration が抽象化されたデータセットではない。全てのデータをメモリ上に保持する設計なため、前段で Spark などを使ったデータ加工処理 (ETL) が必要。
- 扱うことのできる文字コードは UTF-8。C や Java のように String (文字列型) と Char (文字型) は別物。
- ランタイムの環境によって幅省略の整数
Int
や数値リテラルが 32bit になるか 64bit になるかが変わる。C の int と同様に「その環境で最も処理効率の高い幅」を意図したと思われるが、科学技術計算/数値解析向けの高水準言語に環境非互換につながる設計を持ち込んだ判断は支持できないな。これで汎用ライブラリを意図した Julia 実装は 32bit 環境と 64bit 環境の両方で数値が合うかテストする必要が出てしまった。 - 有理数 (Rational) を標準でサポートしている。Int64 環境でも即時約分しているが都度公約数の算出を行っているのだろうか。
数値演算で扱う分数は \(\frac{1}{\sqrt{2\pi\sigma^2}}\) のような形ばかりなので出番はあまりないかもしれないが、浮動小数点の除算による精度低下回避を考慮できるのは良い。julia> a = 2 // 8 1//4 julia> a * 2 1//2