回覆列表
  • 1 # 水母星人

    Julia可以用於從簡單的機器學習應用程式到巨大的超級計算機模擬的所有方面。在某種程度上,Python也可以做到這一點,但是Python不知何故發展成了這樣。

    相比之下,Julia正是為這個目的而生的。自下而上。

    速度

    Julia的創造者希望創造一種和C語言一樣快速的語言 - 但是他們創造出來的語言速度更快。儘管近年來Python變得更容易加速,但是它的效能和Julia相比仍然相去甚遠。

    2017年,Julia甚至加入了Petaflop俱樂部,這是一個小型的程式語言俱樂部,Julia的峰值效能可以超過每秒1 petaflop的速度。除了Julia,目前只有C,C ++和Fortran進入了這個俱樂部。

    社群

    憑藉其 30 多年的歷史,Python 擁有一個非常龐大的支援社群。幾乎任何與 Python 相關的問題在一次谷歌搜尋中都能得到答案。

    相比之下,Julia 社群非常小。雖然這意味著你可能需要進一步挖掘才能找到答案,但你可能會一次又一次地和同樣的人聯絡在一起。這可能會變成超越價值的程式設計師關係。

    程式碼轉換

    你甚至無需知道一條Julia命令,就可以在Julia中進行編碼。你不僅可以在Julia中使用Python和C程式碼。甚至可以在Python中使用Julia!

    不用說,這使得修補Python程式碼的弱點變得非常容易。或者在你還在學習Julia的時候保持高效。

    擁有數量龐大且維護良好的庫,仍然是Python的最強項之一。Julia沒有太多的庫,並且使用者還抱怨說它們還沒有得到令人驚訝的維護。

    但是,當你認為Julia是一門非常年輕的語言,並且資源有限時,實際上他們已經擁有的庫的數量是相當可觀的。除了Julia的庫數量正在增加之外,它還可以與C和Fortran中的庫進行互動以處理繪圖。

    動態和靜態型別

    Python是100%動態型別的。這意味著程式將在執行時確定變數是浮點型還是整型。

    儘管這對初學者非常友好,但它也引入了許多可能的錯誤。這意味著你需要在所有可能的情況下測試Python程式碼。這是一項相當愚蠢的任務,需要花費大量時間。

    由於Julia的創造者也希望它易於學習,因此Julia完全支援動態型別。但是與Python相比,你可以根據需要引入靜態型別。例如,以C或Fortran中的形式出現。

    這可以為你節省大量時間:你可以在有意義的任何地方指定型別,而不是為不測試你的程式碼尋找藉口

  • 2 # 科技航標

    Julia是一個剛剛走入大眾視野的科學計算利器!

    你可能會說了,科學計算?不是有matlab了嗎?而且如果做統計,還有R、Python、Stata之類的可以使用,為什麼要用Julia呢?

    很簡單,方便+快!

    首先,Julia的語法基本上就是Matlab+Python+R的混合,像Matlab一樣簡單,像Python一樣嚴謹,像R...算了,還是不要像R了。

    此外,作為「指令碼語言」以及「科學計算語言」,Julia有個變態的特徵:不怕迴圈!熟悉Matlab、R的人都知道,寫這些程式的時候,通常會被建議「少寫迴圈」。而實際上,如果你沒有遵從這些規則,你會發現寫出來的程式奇慢無比!當然,Matlab中也有一些設計企圖規避迴圈,比如bsxfun等函式,但是很多情況下,迴圈在所難免。

    那麼Julia如何做到「不怕迴圈」這一點呢?Julia做了這麼一些工作。首先,在Julia裡面,是有「型別」的,比如學過C的都知道計算機中數字分為整型(int)、浮點型(float)、雙精度(double)等型別,而Julia也對型別做了嚴格區分。不過不要怕,其實沒什麼大不了的,不會比Matlab複雜多少。而有了型別的區分,Julia使用LLVM這個工具引入了JIT,也就是在程式(比如迴圈體、函式)第一遍被執行的時候,這個迴圈體、函式就已經被編譯好了。當這個迴圈體、函式再次被執行的時候,就不需要重新解釋程式碼,只需要執行編譯好的程式就好了。

    有了這個黑科技,Julia的執行速度理論上是可以接近C的(理論上能達到的最快速度)。實際上我的工作過程中就有大量的程式因為嫌慢使用C寫,速度的確比Matlab不知道要快到哪裡去(這裡提一下,根據我的經驗,不可盲目崇拜C,沒有經驗的人寫出的程式,或者沒有複雜到一定程度的程式,速度可能比Matlab還慢)。

    關於Julia的速度與其他語言的比較,可以參考Julia的網站:The Julia Language,其中有各程式語言的對比。不過這裡要提一下,裡面的引數不能完全相信,比如Matlab等語言的寫法不是最有效的寫法,所以在裡面Matlab可能比Julia慢很多。而實際上,對於最簡單的程式,Julia的速度比不過Matlab的。至於原因嗎,我想有這麼兩點:首先Matlab不用編譯;其次,Matlab使用了Intel的MKL庫,而MKL庫是經過彙編級別的最佳化的。當然,Julia也可以使用MKL,下面我會介紹。

    所以總體說來,當涉及到大量的迴圈的時候,C(Fortran)和Julia是非常不錯的選擇,而出於寫程式的方便程度和學習曲線的考慮,Julia顯然優於C(Fortran)。

    奧,Julia還有個優點沒有說,這個可以秒殺Matlab,那就是:開源,免費!

    此外,Julia還有一個更大的優點:非常方便的呼叫C、Python等寫成的程式。Python本來就被成為「膠水語言」,可以呼叫幾乎所有其他語言,而Julia 可以呼叫Python,這就變相給了Julia這個能力。此外,Julia還可以直接呼叫C寫成的程式。所以平時工作的時候,非常常用的一些模組我都已經寫成C放在一個庫裡面,這樣就可以用Python 呼叫C,Julia呼叫C,R呼叫C,Matlab呼叫C...順便提一下,Matlab也可以呼叫C,但是呼叫方式別提多蛋疼。

    好,下面回到我們學校的問題上來。之前的一個專案我使用Julia+C一起寫的,但是前段時間我們學校的超算中心非得給我們換個賬號,這下好了,之前已經有的Julia突然沒了。前面也說了,我是沒有管理員許可權的,所以使用yum的方式安裝就走不通了。還好Julia是開源的,意味著我可以拿到Julia的原始碼,自己編譯一個。

    可是,真的問題出來了!Redhat出於對「穩定」的變態追求,裡面的程式不會用最新的版本。比如,最坑爹的,gcc(一個c的編譯器)的版本停留在『Red Hat 4.4.7-3』這個版本上。而開源社群日新月異,這個版本太老了,以至於不能編譯Julia了!從此,我開始了漫漫的安裝之旅。

    在介紹我在沒有管理員許可權+沒有新版本gcc的情況下如何安裝Julia之前,可以先介紹一下普通青年安裝Julia的正確姿勢。

    windows使用者,去Julia Downloads上直接下載安裝。建議安裝Julia+Juno的套裝,後者是一個Julia的IDE,如果不裝Juno,Julia的介面會非常不友好!

    Mac使用者,同樣去Julia Downloads上直接下載安裝,安裝方法與Mac軟體的一般安裝方法一樣,安裝好之後在Applications裡。或者可以參考下面Linux使用者使用原始碼安裝,但其實沒這個必要。

    Linux使用者,就有多種選擇了。或者選擇原始碼安裝,我下面會詳細介紹。或者可以安裝已經編譯好的版本。不過更建議使用apt-get(Debian/Ubuntu)、yum(Fedora/Redhat/Cent)安裝。

    安裝好之後,在命令列輸入julia,應該能看到如下介面(win使用者可能需要設定環境變數):

    嗯,下面我就要開始介紹作死的原始碼安裝方式了!

    上面提到了,之所以選擇原始碼安裝,最大的原因是我沒有管理員許可權。其次,原始碼安裝還有個好處就是,可以將Intel的MKL和Julia結合起來,強上加強,至強!

    總的來說,我手動安裝Julia的過程是:

    gmp/mpc/mpfr=>gcc

    Git

    cmake

    Python2=>LLVM

    Julia

    是的,你沒看錯,為了安裝Julia,我安裝了這麼多東西!!!截圖給你們看:

    安裝gcc的原因不用說了,因為編譯Julia需要高版本的gcc,所以必須自己裝一個gcc。為了安裝gcc。在安裝的過程中,提示我缺少gmp/mpc/mpfr這三個包,這個問題不大,按照提示,去相應的網站,找到這幾個包的最新版本,wget 一下,安裝就好了。至於怎麼安裝,一般來說安裝的順序是:

    ./configure --prefix=/home/aragorn/softs/ 其中--prefix可以理解為安裝路徑

    make

    make install

    經過這三個命令,一般就可以安裝好。gmp/mpc/mpfr這三個包都是按照這個順序,wget下載,tar -xvf ***.xz解壓縮,進去,然後按照上面三個步驟安裝。

    至於gcc,可以去Installing GCC - GNU Project上看看,上面有安裝gcc的詳細步驟。注意如果需要安裝gmp/mpc/mpfr這三個包,在configure的時候,後面需要加『--with-gmp=/home/aragorn/softs』,也就是制定者三個包的安裝位置。

    經過大概幾個小時的等待,gcc裝好了。總以為可以編譯Julia了,可是又出錯了!仔細一看,居然是git checkout出錯了!查了一下,臥槽,git命令也是老掉牙啊!沒辦法,去git官網,找git的原始碼下載,git clone git/git · GitHub 下載下來,安裝!安裝過程可以參考資料夾下面的INSTALL檔案,有詳細描述。

    後來又提示我cmake沒有。同樣,按照上述過程,安裝cmake。

    中間我也不記得是哪一步了,提示LLVM必須安裝。裝!可是安裝LLVM的時候,又提示我Python的版本太低!Redhat的Python版本居然是2.6的!!!怎麼能忍,裝!去Python官網,乾脆把Python2 and 3的原始碼都下載了下來,裝裝裝!!!

    這裡需要注意的是,由於安裝的這些程式都是安裝在自己的目錄下面的,所以需要修改環境變數。修改方法如下:

    cd ~

    vim .bashrc

    找到export PATH=(如果沒有則新建),把安裝的程式的bin目錄新增上去,比如我安裝的gcc的目錄是/home/aragorn/bin/gcc/,那麼就要寫成『export PATH="/home/aragorn/bin/gcc/bin:$PATH"』,建議每裝一個程式,都把bin目錄新增進來

    同樣,找到export LD_LIBRARY_PATH=(如果沒有則新建),把安裝的程式的lib/lib64目錄新增上去,比如我的寫成『export PATH="/home/aragorn/bin/gcc/lib64:$LD_LIBRARY_PATH"』,建議每裝一個程式,都把lib目錄新增進來

    :wq

    如此設定,系統找程式或者庫就按照上面的順序開始找。比如雖然系統自帶的gcc版本比較老,但是由於我設定了PATH,所以會先從/home/aragorn/bin/gcc/bin這個目錄找gcc這個命令。修改結束之後,使用 source .bashrc 使得以上更改生效。

    此外,我在瀏覽系統目錄的時候,驚喜的發現原來這臺電腦裡自帶了MKL庫。開心死了。要知道這個庫是付費的,當然對科研工作者是免費的。既然有了,就避免麻煩了,用!怎麼用呢?在編譯Julia之前,要做這麼幾個工作:

    source /opt/intel/bin/compilervars.sh intel64

    source /opt/intel/mkl/bin/mklvars.sh intel64 ilp64

    export MKL_INTERFACE_LAYER=ILP64

    至於這幾步究竟在幹什麼,我也不知道,也懶得去搞清楚,大體是在設定MKL庫的環境變數。

    好了,萬事具備,終於可以編譯julia了!分這麼幾步:

    git clone git://http://github.com/JuliaLang/julia.git 複製原始碼到本地

    cd julia

    git checkout release-0.4 這一步請參考Julia的github主頁,0.4為目前最新的版本號。這一步一定要做,否則自動編譯的是正在開發的版本。

    vim Make.inc 這一步要做很多修改。首先,在開始加入一樣『prefix=/home/aragorn/bin/julia』後面是你要安裝julia的路徑。其次,由於上面已經安裝了最新的LLVM,可以使用最新的LLVM,設定『USE_SYSTEM_LLVM=1』。最後,由於要使用MKL,將『USE_INTEL_MKL ?= 0』『USE_INTEL_MKL_FFT ?= 0』『USE_INTEL_LIBM ?= 0』都改為1。github的網頁上同時建議將『USEICC ?= 0』『 USEIFC ?= 0』也設為1,但是根據我的經驗,intel的icc編譯器並沒有gcc好用,所以建議仍然保留為0,使用gcc。

    make 等待一大段時間

    make install

    好啦,現在設定好環境變數,就可以優雅的開始使用帶MKL的Julia啦!

    最後,我只想吐槽一句,如果搞科學計算,普通青年用Ubuntu/Debian,文藝青年用Gentoo,二逼青年才他媽的用Redhat!!!

  • 中秋節和大豐收的關聯?
  • 對於重男輕女,你是什麼看法?