運籌系列41:Julia入門

參考 https://zhuanlan.zhihu.com/p/41953244

1. 介紹

Julia是麻省理工學院計算機科學和人工智能實驗室(Csil)開發和孵化的一種免費開放源碼語言,於2012年發佈,目標是結合C的速度與Python的可用性、Ruby的動態性、MATLAB的數學能力和R的統計能力。Julia的能力很厲害:能將工作負載分散到數十萬個處理器核,這導致它從機器學習到大規模超級計算機模擬等各個方面的應用。麻省理工學院說Julia是“petaflop club“中唯一的高級動態語言,在世界第10大超級計算機Cori上被用來模擬1.88億顆恆星、星系和其他天體,模擬運行只需14.6分鐘,使用650,000Knights Landing Xeon Phi 核,有1.5千兆秒的運算(每秒四萬億次浮點運算)。Julia採用即時編譯的策略,底層通過LLVM實現,可以爲多個平臺編譯高效的本地代碼。在某些情況下,Julia 可以接近甚至達到 C 語言的速度。 從本質上來說,Julia更傾向於是一種編譯型語言,而不是解釋型語言。

使用它的多分派dispatch範式能表達許多面向對象和函數編程範式,它還有一個非常適合數學運算的語法,有許多數字數據類型和內置的並行支持。Julia的多分派dispatch範式是指允許函數重名,並會在調用時自動根據傳入的參數類型進行分派,非常像java/C++中的函數重載,區別在於,C++/Java是在編譯時完成分派,而Julia是在運行時完成這一工作。此外,Julia和numpy一樣,支持廣播機制,可以在GPU和其它向量化硬件上實現高效的優化計算。

Julia開發都通過GitHub進行(社區驅動),現在上面的代碼貢獻者有200名左右,穩定的、高度活躍的貢獻者約有30名。目前Julia主要用在科學計算上,另外Julia足以勝任的領域之一是教育。下一代學生可以直接跨過現有的技術。IJulia圖形化的Notebook集成(運行Julia的IPython Notebook)使之對於教學極具魅力。研究者、算法開發者和庫作者也在採用Julia,因爲Julia使工作更高效。

2. 安裝

mac上安裝很簡單,brew cask install julia即可。輸入julia進入julia PERL,然後輸入Pkg.add(“PackageName”)安裝包;也可以按 ] 鍵進入pkg模式。

$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.4.2 (2020-05-23)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |
julia> using Pkg
julia> Pkg.add("IJulia")
julia> using IJulia
[ Info: Precompiling IJulia [7073ff75-c697-5162-941a-fcdaad2a7d2a]
julia> notebook()

當然,如果你已經安裝了jupyter notebook的話,直接輸入jupyter notebook啓動即可。

Julia目前所有包均可在https://juliapackages.com/上找到。常用包介紹如下:

基本數據結構:DataFrames
交互:CSV, JSON, XLSX
隨機數:Random
微分方程:DifferentialEquations
線性代數:LinearAlgebra,IterativeSolvers
統計:Turing(貝葉斯),Distributions,StatsBase,Regression,MixedModels,CurveFit,Interpolations,MultivariateAnalysis,HypothesisTests,POMDPs(馬爾科夫決策過程模擬),HMMBase,TimeSeries
凸優化:JuMP(建模)、Convex(凸優化)、GeneticAlgorithms(遺傳算法)
繪圖:Gadfly(科學繪圖)、Plots(可視化),注意這個包的依賴比較大,國內要改一下下載代碼:https://zhuanlan.zhihu.com/p/115118883
圖論:LightGraphs
機器學習:Flux
深度學習:Knet(這個就算了,還是得看python社區)
寫作:Latexify

3. 簡單例子

首先該添加的包都進入pkg模式添加好。
然後進入Julia notebook:

f(x) = x^2+2x+1
print(f(10))

4. 與python/c/Fortran交互

通過PyCall包,Julia可以直接調用Python包。例如:

using PyCall
np= pyimport("numpy")
x = np.linspace(1, 10, 10)

數值、布爾、字符串、IO stream、函數、元組、數組或列表、以及包含這些類型的字典等,它們都會自動進行類型的轉換(Python函數會被轉換或傳遞爲Julia的函數,反之亦然)。其它類型則是通過通用的PyObject提供的。
下面是調用c函數的例子。

ccall((:clock, "libc"), Int32, ()) # 調用C的clock函數

5. OR接口

利用JuMP求解原問題。

function CarpenterPrimal(c,A,b)
    # 定義Model對象, OutputFlag = 0指不輸出log
    Primal = Model(solver = GurobiSolver(OutputFlag = 0))
    # 定義變量,注意這裏使用了宏(macro),宏的調用也是Julia&JuMP高效編譯/元編程(metaprogramming)的重要技巧
    @variable(Primal, x[1:2]>=0)
    # 定義不等式約束
    constr = @constraint(Primal, A*x.<=b)
    # 定義目標函數
    @objective(Primal, Max, dot(c,x))
    # 求解
    solve(Primal)
    # 返回最優目標函數值,最優解(原問題),最優解(對偶問題)
    return getobjectivevalue(Primal), getvalue(x), getdual(constr)
end
using JuMP,GLPK
m = Model(GLPK.Optimizer)
@variable(m,0<=x<=2)
@variable(m,0<=y<=2)
@objective(m,Max,5x+3y)
@constraint(m,1x+5y<=3.0)
JuMP.optimize!(m)
println(JuMP.value(x),",",JuMP.value(y),",",JuMP.objective_value(m))

6. 測試

使用@timeit、@time 來做基本的測試
使用

m = randn(1<<16, 8)

function test_swaprow(m::VecOrMat)
    N = size(m, 1)
    for i = 1:N-1
        swaprows!(m, i, i+1)
    end
    m
end

using BenchmarkTools
@benchmark test_swaprow($m)

返回

BenchmarkTools.Trial: 
  memory estimate:  25.97 MiB
  allocs estimate:  653308
  --------------
  minimum time:     12.866 ms (7.65% GC)
  median time:      17.959 ms (8.86% GC)
  mean time:        18.326 ms (10.94% GC)
  maximum time:     27.736 ms (12.75% GC)
  --------------
  samples:          273
  evals/sample:     1
function swaprows!(v::VecOrMat{T}, i::Int, j::Int) where T
    for c = 1:size(v, 2)
        temp = v[i, c]
        v[i, c] = v[j, c]
        v[j, c] = temp
    end
    v
end
@benchmark test_swaprow($m)
BenchmarkTools.Trial: 
  memory estimate:  0 bytes
  allocs estimate:  0
  --------------
  minimum time:     1.459 ms (0.00% GC)
  median time:      1.524 ms (0.00% GC)
  mean time:        1.582 ms (0.00% GC)
  maximum time:     2.926 ms (0.00% GC)
  --------------
  samples:          3147
  evals/sample:     1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章