Juliaは,技術計算のためのオープンソース,マルチプラットフォーム,高レベル,高性能なプログラミング言語です.
JuliaはLLVMLow-Level Virtual Machine (LLVM) は, 中間コードあるいはマシンコードを作るためのコンパイラ・インフラストラクチャです.ベースのJIT Just-In-Timeコンパイルは,実行前ではなく実行時に実行されます. したがって,コンパイルされたコードの速度と解釈の柔軟性が得られます. コンパイラはコードを解析して型を推定します.LLVMコードが生成された後に,ネイティブコードにコンパイルされます.コンパイラを備えています. これは,低レベルコードの煩わしさなしに, CやFORTRANなどの言語と同等の性能を引き出します. コードは,その場でコンパイルされるため,シェルすなわちREPL Read-Eval-Print-Loop; 対話型評価ループ内でコード(の断片)を実行できます. REPLは推奨されるワークフロー(workflow )の一部です.
Juliaは動的型付けされていて, 多重ディスパッチ 関数の引数の型は実行時に決まるので,コンパイラは与えられた型に最適化された実装を選ぶことができます.の機能を提供し,並列性と分散計算を目的に設計されました.
Juliaには,パッケージマネージャが組み込まれています.
Juliaには,特殊関数(例:ガンマ関数)を含む多くの数学関数が組み込まれています.また,複素数をすぐに利用できます.
Juliaは,Lispに影響を受けたマクロのおかげでコードを自動生成することができます.
Juliaは2012年に生まれました.
| 代入 | answer = 42x, y, z = 1, [1:10; ], "A string"x, y = y, x # x と y を交換 |
| 定数の定義 | const DATE_OF_BIRTH = 2012 |
| 行末のコメント | i = 1 # コメント |
| 区切り付きのコメント | #= これもコメント =# |
| 式の連結 (Chaining) | x = y = z = 1 # 右から左へ0 < x < 3 # true5 < x != y < 5 # false |
| 関数の定義 | function add_one(i) return i + 1end |
| LaTeX 記号を挿入する | \delta に [Tab] キー |
| 基本演算 | +, -,*,/ |
| 指数 | 2^3 == 8 |
| 割り算 (左除法) | 3/12 == 0.25 |
| 右除法 | 7\3 == 3/7 |
| 余り (剰余) | x % y または rem(x,y) |
| 論理否定 | !true == false |
| 値が等しいか | a == b |
| 値が異なるか | a != b または a ≠ b |
| より小さいか,より大きいか | < と > |
| 以下か | <= または ≤ |
| 以上か | >= または ≥ |
| 要素毎の演算 | [1, 2, 3] .+ [1, 2, 3] == [2, 4, 6][1, 2, 3] .* [1, 2, 3] == [1, 4, 9] |
| 数ではないか | isnan(NaN).注意: NaN == NaN は false です |
| 三項演算子 | a == b ? "Equal" : "Not equal" |
| 短絡評価 AND と OR | a && b と a || b |
| オブジェクトが等価か | a === b |
| 最後の結果 | ans |
| 実行を中断する | [Ctrl] + [C] |
| スクリーンを消去する | [Ctrl] + [L] |
| (ファイルに書かれた)プログラムを実行する | include("filename.jl") |
func の定義に関するヘルプを見る |
?func |
文字列 func が用いられた全ての定義を見る |
apropos("func") |
| コマンド・ラインのモードに入る | ; |
| パッケージ・マネージャのモードに入る | ] |
| ヘルプのモードに入る | ? |
| 特別なモードを抜ける / REPLに戻る | 空行で [Backspace] |
| REPL を抜ける | exit() or [Ctrl] + [D] |
Juliaのロードを高速化するため,多くのコア機能が Juliaに付属する標準ライブラリに入っています.
これらの機能を使うには,using PackageName とします.
以下に,標準ライブラリの一部と,よく使う関数を示します.
Random |
rand, randn, randsubseq |
Statistics |
mean, std, cor, median, quantile |
LinearAlgebra |
I, eigvals, eigvecs, det, cholesky |
SparseArrays |
sparse, SparseVector, SparseMatrixCSC |
Distributed |
@distributed, pmap, addprocs |
Dates |
DateTime, Date |
パッケージは,パッケージマネージャに表示される前に登録される(registered)必要があります.
Julia 1.0でパッケージマネージャを扱うには,2つの方法があります.
一つは,using Pkg と Pkg パッケージの関数を使う方法です.
もう一つは,REPLに ] と入力して特別な対話型パッケージ管理モードに入る方法です (通常のREPLに戻るには,パッケージ管理モードで空行のBACKSPACEを押します ).
Juliaをインストールした直後はパッケージ管理モードを使います.Pkg モジュールをインストールすると,Juliaセッションで Pkg を利用できるようになります.
Pkg を使う方法| インストール済のパッケージを列挙する (人間が読める形式) | Pkg.status() |
| インストール済のパッケージを列挙する (機械可読形式) | Pkg.installed() |
| 全てのパッケージを更新する | Pkg.update() |
Install PackageName をインストールする |
Pkg.add("PackageName") |
PackageName を再構築(ビルド)する |
Pkg.build("PackageName") |
PackageName を使用する (インストール後) |
using PackageName |
PackageName を削除する |
Pkg.rm("PackageName") |
PackageName を追加する |
add PackageName |
PackageName を削除する |
rm PackageName |
PackageName を更新する |
update PackageName |
| 開発版を使う | dev PackageName または dev GitRepoUrl |
| 開発版の使用を中止し,公開版に戻す | free PackageName |
| 文字 | chr = 'C' |
| 文字列 | str = "A string" |
| 文字コード | Int('J') == 74 |
| 文字コードから文字を得る | Char(74) == 'J' |
| UTF 文字 | chr = '\uXXXX' # 4-digit HEXchr = '\UXXXXXXXX' # 8-digit HEX |
| 文字列を一文字ごとに繰り返す | for c in str println(c)end |
| 文字列の連結 | str = "Learn" * " " * "Julia" |
| 文字列の補間 | a = b = 2println("a * b = $(a*b)") |
| 文字または正規表現にマッチした最初の文字のインデックス | findfirst(isequal('i'), "Julia") == 4 |
| (サブ)文字列または正規表現にマッチした文字列を置換する | replace("Julia", "a" => "us") == "Julius" |
| 最後のインデックス | lastindex("Hello") == 5 |
| 文字数 | length("Hello") == 5 |
| 正規表現 | pattern = r"l[aeiou]" |
| match オブジェクト | str = "+1 234 567 890"pat = r"\+([0-9]) ([0-9]+)"m = match(pat, str)m.captures == ["1", "234"] |
| pat にマッチしたサブ文字列からなる配列 | [m.match for m = eachmatch(pat, str)] |
| pat にマッチするmatch オブジェクトによるイテレータ | eachmatch(pat, str) |
UTF-8 は,多バイトで Unicode エンコードされることに注意してください.([訳注] 文字列の最後のインデックスと文字数は異なる場合があります)
10 == lastindex("Ångström") != length("Ångström") == 8
文字列はイミュータブル(不変, 変更不能)です.
| 整数型 | IntN および UIntN ただし N ∈ {8, 16, 32, 64, 128}, BigInt |
| 浮動小数点型 | FloatN ただし N ∈ {16, 32, 64}BigFloat |
| 型 type で表される最も小さい数,最も大きい数 | typemin(Int8)typemax(Int64) |
| 複素数型 | Complex{T} |
| 虚数単位 | im |
| 計算機イプシロン | eps() # same as eps(Float64) |
| 丸める | round() # 結果は浮動小数点数round(Int, x) # 結果は整数 |
| 型を変換する | convert(TypeName, val) # attempt/errortypename(val) # calls convert |
| 全域の定数 | pi # 3.1415...π # 3.1415...im # real(im * im) == -1 |
| その他の定数 | using Base.MathConstants |
Juliaは,桁あふれを自動的に検査しません. 整数の桁あふれを検査するには,SaferIntegersパッケージを使ってください‥
擬似乱数関数の多くは using Random が必要です.
| 乱数の種を設定する | seed!(seed) |
| 一様乱数,正規乱数 | rand() # uniform [0,1)randn() # normal (-Inf, Inf) |
| それ以外の分布の乱数 | using Distributionsmy_dist = Bernoulli(0.2) # For examplerand(my_dist) |
| 包含確率 p の下で,A の要素を無作為抽出する | randsubseq(A, p) |
| A の要素の順番をランダムにする | shuffle(A) |
| 配列の宣言 | arr = Float64[] |
| メモリ確保の準備 | sizehint!(arr, 10^4) |
| (配列要素の)アクセス(読み出し)と代入 | arr = Any[1,2]arr[1] = "Some text" |
| 比較 | a = [1:10;]b = a # b points to aa[1] = -99a == b # true |
| 全ての要素を複製する (not address) | b = copy(a)b = deepcopy(a) |
| インデックス m から n までのサブ配列を選ぶ | arr[m:n] |
| 寸法 n で,全ての要素が 0.0 の配列を作る | zeros(n) |
| 寸法 n で,全ての要素が 1.0 の配列を作る | ones(n) |
| 寸法 n で,全ての要素が #undef の配列を作る | Vector{Type}(undef,n) |
| start から stop まで,等間隔の n 個の数字の列を作る | range(start,stop=stop,length=n) |
| Int8 型の乱数 n 個を要素とする配列を作る | rand(Int8, n) |
| 配列 arr を値 val で満たす | fill!(arr, val) |
| 末尾の配列要素をポップする | pop!(arr) |
| 最初の配列要素をポップする | popfirst!(a) |
| val を末尾の要素としてプッシュする | push!(arr, val) |
| val を最初の要素としてプッシュする | pushfirst!(arr, val) |
| インデックス idx の要素を削除する | deleteat!(arr, idx) |
| 整列する ([訳注] 元の配列を変更する) | sort!(arr) |
| 配列 a に 配列 b を連結する ([訳注] a は書き換わる) | append!(a,b) |
| val が要素として含まれているかを検査する | in(val, arr) または val in arr |
| スカラー積 (内積) | dot(a, b) == sum(a .* b) |
| (可能なら)寸法を変える | reshape(1:6, 3, 2)' == [1 2 3; 4 5 6] |
| 配列を文字列に変える (要素の間にデリミタ del を挿入する) | join(arr, del) |
線形代数のツールの多くを使う場合には,using LinearAlgebra してください.
| 単位行列 | I # 定数 LinearAlgebra.I. 任意の寸法の行列に対して恒等変換となる. |
| 行列を定義する | M = [1 0; 0 1] |
| 行列の寸法 | size(M) |
インデックス i の列を選ぶ |
M[i, :] |
インデックス i の列を選ぶ |
M[:, i] |
| 水平方向に連結する | M = [a b] または M = hcat(a, b) |
| 垂直方向に連結する | M = [a ; b] または M = vcat(a, b) |
| 行列の転置 | transpose(M) |
| 行列の共役転置 | M' or adjoint(M) |
| 行列の跡 (トレース) | tr(M) |
| 行列式 | det(M) |
| 行列の階数 (ランク) | rank(M) |
| 行列の固有値 | eigvals(M) |
| 行列の固有ベクトル | eigvecs(M) |
| 逆行列 | inv(M) |
行列方程式 M*x == v を解く |
M\v の方が優れる.逆行列を使うより,数値的に安定で,計算が速い,inv(M)*v |
| Moore-Penrose の擬似逆行列 | pinv(M) |
Julia は,行列の分解(matrix decompositions)を組み込みで用意しています.
Julia は,行列が特別な種類(対称,エルミートなど)であるかを推定しようとしますが,
失敗することもあります.
Julia が,最適なアルゴリズムを選択するのを助けるために,
特別な行列は,その構造を表した関数 (Symmetric, Hermitian, UpperTriangular, LowerTriangular, Diagonal など) を用いて定義できます.
| 条件分岐 | if-elseif-else-end |
単純な for ループ |
for i in 1:10 println(i)end |
2つのループ変数を,一つの for 文に書く |
for i in 1:10, j = 1:5 println(i*j)end |
| 数えながら繰り返す | for (idx, val) in enumerate(arr) println("the $idx-th element is $val")end |
while ループ |
while bool_expr # do stuffend |
| ループから抜け出す | break |
| 残りの処理をスキップする | continue |
関数の全ての引数は,参照で渡されます.
名前の末尾に ! がついた関数は,少なくとも1つの引数(通常は最初の引数)を変更します : sort!(arr).
必須の引数は,コンマ , で区切ります.位置による表記が用いられます.
オプション引数は,既定値 (デフォルト値)が必要です.関数定義(シグネチャ)の中で = を用いて定義します.
キーワード引数は,キーワード名を付けた表記が用いられます.関数定義(シグネチャ)の中で,セミコロン ; の後に列挙されます.
function func(req1, req2; key1=dflt1, key2=dflt2)
# do stuff
end
キーワード引数を受け取る関数の呼び出しでは,セミコロン ; は不要です.
return 文は必須ではありませんが,使うことが推奨されます.
複数のデータ構造を戻り値にできます.一つの return 文でタプルを使います.
コマンドライン引数 julia script.jl arg1 arg2... は,全域定数 ARGS を用いて読み出すことができます :
for arg in ARGS
println(arg)
end
匿名関数は,コレクション関数またはリスト内包表記で使うのに適しています : x -> x^2.
関数は,可変長の引数を受け取ることもできます:
function func(a...)
println(a)
end
func(1, 2, [3:5]) # tuple: (1, 2, UnitRange{Int64}[3:5])
関数定義は,入れ子に(ネスト)できます:
function outerfunction()
# do some outer stuff
function innerfunction()
# do inner stuff
# can access prior outer definitions
end
# do more outer stuff
end
関数定義は,戻り値の型を明示することもできます.
# take any Number subtype and return it as a String
function stringifynumber(num::T)::String where T <: Number
return "$num"
end
関数呼び出しは,ドット構文を用いてベクトル化できます (vectorized).
# here we broadcast the subtraction of each mean value
# by using the dot operator
julia> using Statistics
julia> A = rand(3, 4);
julia> B = A .- mean(A, dims=1)
3×4 Array{Float64,2}:
0.0387438 0.112224 -0.0541478 0.455245
0.000773337 0.250006 0.0140011 -0.289532
-0.0395171 -0.36223 0.0401467 -0.165713
julia> mean(B, dims=1)
1×4 Array{Float64,2}:
-7.40149e-17 7.40149e-17 1.85037e-17 3.70074e-17
Julia は,引数のデータ型に基づき関数の特殊なバージョン「多重ディスパッチ」 どのバージョンを呼び出すかを「動的」に決める「ポリモーフィズム」の一種類です. この文脈では,「動的」とは実行時に決定することを意味します. これに対して,メソッド・オーバーロードは,コンパイル時に決定します. Julia は,完全にバックグラウンドで多重ディスパッチを行います. もちろん,型注釈(type annotation)を用いて,メソッド・オーバーロードを指定することもできます.を生成します. 関数が同じ引数のデータ型で再び呼び出されたときには, Julia は,同じ型のネイティブ・マシン・コードを検索して, コンパイルのプロセスをスキップします.
Julia 0.5 以降も,潜在的な型の曖昧さの存在は許されますが, 曖昧なメソッドの呼び出しを呼び出すことは 即時エラー となります.
再帰関数が多くのレベルを深くネストすると,スタックオーバーフローが発生する可能性があります.
末尾再帰の最適化は Trampolining と呼ばれる手法で可能ですが, Julia では自動的に行いません. あるいは,プログラマが,末尾再帰を繰返しとして書き直すこともできます.
| ディクショナリ(辞書) | d = Dict(key1 => val1, key2 => val2, ...)d = Dict(:key1 => val1, :key2 => val2, ...) |
| 全てのキー (イテレータ) | keys(d) |
| 全ての値 (イテレータ) | values(d) |
| キー, 値のペアで繰り返す | for (k,v) in d println("key: $k, value: $v")end |
キー :k が存在するかチェックする |
haskey(d, :k) |
| キー (あるいは値)を配列にする | arr = collect(keys(d))arr = [k for (k,v) in d] |
ディクショナリ(辞書)はミュータブル(変更可能)です; しかし, シンボルをキーとして使用する場合,キーはイミュータブル(不変, 変更不能)です.
| 集合の定義 | s = Set([1, 2, 3, "Some text"]) |
和集合 s1 ∪ s2 |
union(s1, s2) |
共通集合 s1 ∩ s2 |
intersect(s1, s2) |
差集合 s1 \\ s2 |
setdiff(s1, s2) |
対称差集合 s1 △ s2 |
symdiff(s1, s2) |
部分集合か? s1 ⊆ s2 |
issubset(s1, s2) |
要素が集合に含まれるかどうかのチェックは O (1) で行われます.
| コレクション coll の全ての要素にfを適用する | map(f, coll) またはmap(coll) do elem # do stuff with elem # must contain returnend |
| coll にfを適用し true(真)となる要素のみ取り出す | filter(f, coll) |
| リスト内包表記 | arr = [f(elem) for elem in coll] |
Juliaにはクラスがなく,クラス固有のメソッドもありません.
型は,メソッドを持たないクラスのようなものです.
抽象(アブストラクト)型は下位型(サブタイプ)を作れますが,インスタンス化はできません.
具象(コンクリート)型は下位型(サブタイプ)を作れません.
既定(デフォルト)では,構造体はイミュータブル(不変,変更不能)です.
イミュータブルな型は,性能を向上させ,スレッドセーフです (それらは,スレッド間で同期を行わずに共有できるからです).
型の集合の一つをとるようなオブジェクトは,共用(ユニオン)型と呼ばれます.
| 型注釈 (アノテーション) | var::TypeName |
| 型宣言 | struct Programmer name::String birth_year::UInt16 fave_language::AbstractStringend |
| ミュータブル(変更可能な)型の宣言 | struct を mutable struct に置き換える |
| 型の別名(エイリアス) | const Nerd = Programmer |
| Type constructors | methods(TypeName) |
| 型のインスタンス化 | me = Programmer("Ian", 1984, "Julia")me = Nerd("Ian", 1984, "Julia") |
| 下位型(サブタイプ)の宣言 | abstract type Bird endstruct Duck <: Bird pond::Stringend |
| パラメトリック型 | struct Point{T <: Real} x::T y::Tendp =Point{Float64}(1,2) |
| 共用(ユニオン)型 | Union{Int, String} |
| 型の階層を探索する | supertype(TypeName) and subtypes(TypeName) |
| 既定の上位型 (スーパータイプ) | Any |
| 全てのフィールド名 | fieldnames(TypeName) |
| 全てのフィールドの型 | TypeName.types |
型が内部コンストラクタで定義された場合,
デフォルトの外部コンストラクタは使用できません
(必要に応じて手動で定義する必要があります).
内部コンストラクタは,
パラメータが invariant (不変性)の条件を満たすことをチェックする場合に使うのに,
適しています.なぜなら,
この型がイミュータブル(不変,変更不能)と定義されていなければ,
フィールドに直接アクセスして変更しようとすると,この不変性が破られるからです.
newキーワードは,同じ型のオブジェクトを作成するために用いられます.
ここで,型パラメータが invariant (不変) であるとは,
( Float64 <: Real にもかかわらず )
Point{Float64} <: Point{Real} が成り立たないことを意味します.
型推論がなされた形の Juliaの内部表現は code_typed() で見ることができます.
これは,特定の型向けのネイティブコードではなく,
Any型向けのコードが,どこで生成させたのかを突き止めるのに役に立ちます.
| 存在しない値 | nothing |
| 欠落したデータ | missing |
| Float型の,数でない値 | NaN, NaN16, NaN32, NaN64, big"NaN" NaN === NaN64 |
missing を取り除く |
collect(skipmissing([1, 2, missing])) == [1, 2] |
missings を置換する |
replace([1, missing, 2], missing=>0) == [1, 0, 2] |
missing か否かを検査する |
ismissing(x).注意: x == missing では検査できません |
| 例外 SomeExcep を発生させる | throw(SomeExcep()) |
| 現在の例外を再発生させる | rethrow() |
| 新しい例外 NewExcep を定義する | struct NewExcep <: Exception v::StringendBase.showerror(io::IO, e::NewExcep) = print(io, "A problem with $(e.v)!")throw(NewExcep("x")) |
テキスト msg でエラーを発生させる |
error(msg) |
| 例外を捕捉する | try # do something potentially iffycatch ex if isa(ex, SomeExcep) # handle SomeExcep elseif isa(ex, AnotherExcep) # handle AnotherExcep else # handle all others endfinally # do this in any caseend |
モジュールとは,個別の全域変数の作業領域で,似たような機能を一箇所にまとめたものです.
| 定義 | module PackageName# add module definitions# use export to make definitions accessibleend |
filename.jl を取り込む(インクルードする) |
include("filename.jl") |
| 読み込む | using ModuleName # all exported namesusing ModuleName: x, y # only x, yusing ModuleName.x, ModuleName.y: # only x, yimport ModuleName # only ModuleNameimport ModuleName: x, y # only x, yimport ModuleName.x, ModuleName.y # only x, y |
| 輸出(エクスポート)する | # Get an array of names exported by Modulenames(ModuleName)# include non-exports, deprecateds# and compiler-generated namesnames(ModuleName, all::Bool)#also show namesexplicitely imported from other modulesnames(ModuleName, all::Bool, imported::Bool) |
using と import の違いは,ただ一つです :
using Foo では,
Foo モジュールの関数 bar を新しいメソッドとして拡張する場合に
function Foo.bar(.. と書く必要があります.
これに対して,import Foo.bar では,
function bar(... と,そのまま書けばよいです.モジュール Foo の関数 bar は自動的に拡張されます.
Julia は同図像性を持ちます.すなわち,プログラムは Julia言語自体のデータ構造として表されます.実際,すべてが式 Expr です.
シンボルは,先頭にコロン : がついた
インターン化された文字列
それぞれ異なる(イミュータブルな, 変更不能な)文字列につき,ただ一つの文字列だけが保存されることをいいます.です.
シンボルは,より効率的で,識別子,(辞書の)キー,あるいは,データ・フレームの列として,よく使用されます.
シンボル同士は連結できません.
クォート化 :( ... ) あるいは quote ... end も,式を作ります.
parse(str)
この形式は,動的SQLの知識があるユーザーに最もなじみがあります.Meta.parse 関数は,Oracle や PostgreSQLの EXECUTE IMMEDIATE文,あるいは,
SQL サーバの sp_executesql() プロシージャと同様です. と Expr(:call, ...) も,同様に式を作ります.
x = 1
line = "1 + $x" # some code
expr = Meta.parse(line) # make an Expr object
typeof(expr) == Expr # true
dump(expr) # generate abstract syntax tree
eval(expr) == 2 # evaluate Expr object: true
マクロは,生成されたコード (すなわち,式)をプログラム内に挿入することを可能とします.
| 定義 | macro macroname(expr) # do stuffend |
| 使い方 | macroname(ex1, ex2, ...) or @macroname ex1, ex2, ... |
| 組み込みのマクロ | @test x == y # 値が等しい(正確に)@test x ≈ y # isapprox(x, y) 値がほぼ等しい@assert # assert (unit test)@which # types used@time # time and memory statistics@elapsed # time elapsed@allocated # memory allocated@profile # profile@spawn # run at some worker@spawnat # run at specified worker@async # asynchronous task@distributed # parallel for loop@everywhere # make available to workers |
衛生的な マクロを作るための約束は,以下のとおりです:
local で宣言する.eval を呼び出さない.$(esc(expr))並列計算ツールは,標準ライブラリ Distributed を用いて利用できます.
| N個のワーカーを含む REPLを開始する | julia -p N |
| 利用可能なワーカーの数 | nprocs() |
| N 個のワーカーを追加する | addprocs(N) |
| 全てのワーカー id を印字する | for pid in workers() println(pid)end |
| 実行中のワーカーの id を得る | myid() |
| ワーカーを削除する | rmprocs(pid) |
| pid に対して,引数 args で f を実行する | r = remotecall(f, pid, args...)# or:r = @spawnat pid f(args)...fetch(r) |
| 上と同じ (より効率のよい方法) | remotecall_fetch(f, pid, args...) |
| 任意のワーカーに対して,引数 args で f を実行する | r = @spawn f(args) ... fetch(r) |
| 全てのワーカーに対して,引数 args で f を実行する | r = [@spawnat w f(args) for w in workers()] ... fetch(r) |
| 全てのワーカーに対して,式 expr を利用可能とする | @everywhere expr |
| reducerreducerは,異なる(独立な)ワーカーからの結果を結合します関数 red を用いた並列ループ | sum = @distributed (red) for i in 1:10^6 # do parallelstuffend |
| コレクション coll の全ての要素に対して,f を適用する | pmap(f, coll) |
ワーカーは,並行(コンカレント)あるいは並列(パラレル)なプロセスとしても知られています.
並列処理機能を備えたモジュールは, 「関数ファイル」と「ドライバファイル」に最もよく分割できます. 「関数ファイル」は,全てのワーカーで必要とされる関数と変数の全てを含みます. データ処理を扱う「ドライバファイル」は「関数ファイル」にインポートされる必要があります.
reducer 関数に関する例 (word count)は,こちらを参照してください. Adam DeConinck.
| stream を読む | stream = stdinfor line in eachline(stream) # do stuffend |
| file を読む | open(filename) do file for line in eachline(file) # do stuff endend |
| CSV ファイルを読む | using CSVdata = CSV.read(filename) |
| CSV ファイルとして書き出す | using CSVCSV.write(filename, data) |
| Julia オブジェクトをファイルに保存する | using JLDsave(filename, "object_key", object, ...) |
| Julia Object をファイルから読み込む | using JLDd = load(filename) # Returns a dict of objects |
| HDF5 ファイルとして保存する | using HDF5h5write(filename, "key", object) |
| HDF5 ファイルを読み込む | using HDF5h5read(filename, "key") |
dplyr に似たツールについては,DataFramesMeta.jl. を見てください.
| Stata, SPSS, などのファイルを読むには | StatFiles Package |
DescribeSimilar to summary(df) in R. data frame |
describe(df) |
列 col のベクトルを作る |
v = df[:col] |
列 col に関して整列(ソート)する |
sort!(df, [:col]) |
CategoricalSimilar to df$col = as.factor(df$col) in R. col |
categorical!(df, [:col]) |
col の level を列挙する |
levels(df[:col]) |
col の列の値が val と等しいデータを抜き出す |
df[df[:col] .== val, :] |
| wide形式からlong形式に変換する | stack(df, [1:n; ])stack(df, [:col1, :col2, ...])melt(df, [:col1, :col2]) |
| long形式からwide形式に変換する | unstack(df, :id, :val) |
Nullable を許すように,列の型を変換する |
allowmissing!(df) or allowmissing!(df, :col) |
| 列に沿って繰り返す | for r in eachrow(df) # do stuff. # r is Struct with fields of col names.end |
| 行に沿って繰り返す | for c in eachcol(df) # do stuff. # c is tuple with name, then vectorend |
| :groups_col に対して,関数 func を適用する | by(df, :group_col, func) |
| クエリ (Query) | using Queryquery = @from r in df begin @where r.col1 > 40 @select {new_name=r.col1, r.col2} @collect DataFrame # Default: iteratorend |
| name の型 | typeof(name) |
| 型をチェックする | isa(name, TypeName) |
| 下位型(サブタイプ) を列挙する | subtypes(TypeName) |
| 上位型(スーパータイプ) を得る | supertype(TypeName) |
| 名前 func のメソッドを列挙する | methods(func) |
| JIT バイトコードを表示する | code_llvm(expr) |
| ネイティブコードを表示する | code_native(expr) |
多くのコア・パッケージが Julia コミュニティにより管理されています.これらには,Julia[Topic] という名前がついています.
| 統計 | JuliaStats |
| 微分方程式 | JuliaDiffEq (DifferentialEquations.jl) |
| 自動微分 | JuliaDiff |
| 数値最適化 | JuliaOpt |
| プロット | JuliaPlots |
| ネットワーク(グラフ)解析 | JuliaGraphs |
| Web | JuliaWeb |
| 地理空間 | JuliaGeo |
| 機械学習 | JuliaML |
| 極めてよく用いられるパッケージ | DataFrames # linear/logistic regressionDistributions # Statistical distributionsFlux # Machine learningGadfly # ggplot2-likeplottingLightGraphs # Network analysisTextAnalysis # NLP |
読みやすくするために必要でない限り,下線 (アンダースコア, _ )を避けるのが,Julia の慣習です.
変数名は小文字とします. somevariable
(あるいは,スネークケース (snake case, スペースをアンダースコアに置き換えた綴り方) にします)
定数名は大文字とします. SOMECONSTANT
関数名は,小文字とします. somefunction (あるいは,スネークケースにします)
マクロ名は,小文字とします. @somemacro (あるいは,スネークケースにします)
型の名前は,頭文字を大文字としたキャメル・ケース (空白を詰めて次の語を大文字から始めた綴り方) とします. SomeType
Juliaファイルは,拡張子 jl を持ちます.
Juliaのコードスタイルの詳細は,マニュアル style guide を参照してください.
sizehint!を使います.arr=nothing を使ってメモリを解放しましょう.disable_gc()....) 演算子を使用しないでください.!がつく関数) を使いましょう.データ構造のコピーを回避できます.try-catch を使用しないでください.Any を避けましょう.eval の使用を避けましょう.