Julia
インストール
エラー報告時のお役立ち: versioninfo()
あとで整理
- Manual: Performance Tips
- GitHub: Algorithms for Optimization Jupyter Notebooks
- スタンフォード ベクトル・行列からはじめる最適化数学
- slurping・splatting
- 関数の第一引数に関数を渡すときのdo notation
- 型パラメーター指定のwhere
- マクロ関係
Meta.parse
, dump
, :(begin hoge end),
quote end`
- P203, {using BenchmarkTools},
@btime
, @code_llvm
, @code_typed
, @code_warntype
, @inferred
, @kwdef
MacroTools.postwalk
Meta.lower
, Base.getproperty
, @edit
filter
| a = Array(3:999)
flt3or5(x) = x % 3 == 0 || x % 5 == 0
sum(filter(flt3or5, a))
|
importとusing
サンプルコード
| module MyModule
export x, y
x() = "x"
y() = "y"
p() = "p"
end
|
using MyModule
- in-scope: All exported names (x and y), MyModule.x, MyModule.y, and MyModule.p
- extensible: MyModule.x, MyModule.y, and MyModule.p
using MyModule: x, p
- in-scope: x and p
- extensible: (nothing)
import MyModule
- in-scope: MyModule.x, MyModule.y, and MyModule.p
- extensible: MyModule.x, MyModule.y, and MyModule.p
import MyModule.x, MyModule.p
- in-scope: x and p
- extensible: x and p
import MyModule: x, p
- in-scope: x and p
- extensible: x and p
ipynb化 Literate
を使う
#-
を入れると生成したipynbのセルを区切れる.
下記コードでipynbが生成できる.
| using Literate
Literate.notebook("example.jl", "."; documenter=false, credit=false, execute=false) # コードセルの評価なし
Literate.notebook("example.jl", "."; documenter=false, credit=false, execute=true) # コードセルの評価あり
|
Jupyter 画像の表示
- URL
Using IJulia; IJulia.display()
で表示できる - 他にもまだあるはずなので随時追記
| using Images
image = [RGB(rand(N0f8,3)...) for x in 1:200, y in 1:150]
using IJulia
IJulia.display(image)
|
Jupyter Info
のログを出力させない
| import Logging
Logging.disable_logging(Logging.Info)
|
map
| map(fn, array)
str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
map(x -> parse(BigInt, x), split(str, "\n"))
|
Plots アニメーション作成
| using Plots
@gif for t in 1:300
t番目のフレームのグラフをプロットするコード
end
|
| using Plots
anim = @animate for t in 1:300
t番目のフレームのグラフをプロットするコード
end
gif(anim, "foo.gif"; fps=20)
|
黒木メモ ツリーのメモ: リーマン予想の簡単な数値的検証
黒木メモ Juliaでのobject.method()
スタイルの欠点
黒木メモ PyCall, Juliaから使うPythonの指定・設定
改めて試したとき (私の環境でインストールした) Juliaが独自にインストールしたCondaを使ってしまっていた. 別途インストールしている自分のPythonと合わせたいので, Juliaが使うPythonのパスを指定した.
| julia> ENV["PYTHON"] = "任意のpython.exeのフルパス(python.exeを含む)"
julia> ]
pkg> build PyCall
|
元に戻すのは次の通り.
| julia> ENV["PYTHON"] = ""
julia> ]
pkg> build PyCall
|
黒木メモ リスト内包表記
このツリーのメモ. 適当に編集して見やすくする.
例えば [f(x) for x in X]
はリスト内包表記ではないし(リストではなくVectorができる)、多くの場合に[ ]で囲まない (f(x) for x in X) の方がよい(遅延評価されるGeneratorができる)。
sum([f(x) for x in X])
と書くのは、 [ ] で囲んでいるせいでVector=1次元配列が作られ、その分だけメモリアロケーションが発生するので非常に損である。[ ] で囲むのをやめてsum(f(x) for x in X)
とした方がよい。さらにsum(f, X)
がシンプル!
| Y = []
for x in X
push!(Y, sinpi(x))
end
Y
|
のようなコードを書くのもひどく損である。 Y
がAny型成分のVectorになり、大幅な速度的劣化を招く。 Y = sinpi.(X)
の方がよい.
ただし、公式ドキュメントのPerformance Tipsには目を通して、したがっておいた方が無難。
問題の設定を変えたければ、グローバル変数に値を代入している行を書き変える。それを何度でも繰り返す。 手抜きのコードを気楽に書いてもよいことにするべきだと私は強く思っているのですが、わざわざ、高等教育でそういう効率の悪すぎるワークフローを教えるのはひどい。 シンプルで分かりやすい処方箋は ①問題を記述するパラメータ群は1つの変数probにまとめる。 ②問題を記述するパラメータ群が梱包された変数probをその問題を解くために使用される函数に常に引数として渡す。 ③問題を解く函数をsol = solve(prob)のように使えるようにしておく。 問題を記述するパラメータ群をまとめるためにstructを使ってもよいし、もっと気楽にTupleやNamedTupleを使ってもよい。 例えば、単振り子の問題を記述するパラメータ群をNamedTupleにprob = (g = 9.80665, l = 2.0)
とまとめたりする。
入門直後のプログラミング言語だと、そもそもコードがどのように構文解釈されるかがよくわからない。 JuliaではREPLなどで、どのようにパースされるかを確認したいコードを :( ) で囲んだ結果を見ればよいです。 函数の仕様は多くの場合に ?函数名 で確認できる。doc stringは大事。
入門直後のプログラミング言語は何をやっているかイメージがつかめなくて苦労する。 Juliaではシンプルな函数を書いて次のように書くと色々分かります。
| @code_warntype f(1.2)
@code_typed f(1.2)
@code_llvm f(1.2)
@code_native f(1.2)
|
黒木メモ パイプ
標準のパイプだと書けない描き方もマクロ版がある. 例えばChain
.
マクロなしでも次のような描き方はできる.
| (1, 2, 3) |>
(((a, b, c),) -> a + b + c) |>
println
|
| (1, 2, 3) |>
((a, b, c),) -> a + b + c |>
println
|
| f((a, b, c)) = a + b + c
t = (1, 2, 3)
f(t)
|
数値
mod
結果として巨大な数になるときの累乗
文字列に変換
パッケージ関係
アンインストール: gc --all
all
オプションを付けると使用されていない期間にかかわらず.julia/environments
のProject.toml
に記載されていない全てのパッケージと関連するア=ティファクトが削除される
インストールされているパッケージを表示
| using Pkg;Pkg.installed()
|
指定したバージョンのパッケージをインストールする
| using Pkg; Pkg.add(PackageSpec(name="JuMP", version="0.18"))
|
指定したパッケージをインストール
| using Pkg;Pkg.add("JuMP")
|
指定したパッケージを削除
| using Pkg; Pkg.rm("JuMP")
|
すべてのパッケージをアップデート
文字列のパース・変換
| parse(BigInt, x)
parse(Int, x)
parse(Int64, x)
parse(Float, x)
parse(Float64, x)
|
乱数のシード固定
- URL
myseed=1234; Random.seed!(myseed=1234)
を各セルで実行する必要がある模様 - 各関数に
seed=myseed
でデフォルト引数を設定しておくと便利