為科學研究學習Julia是否有價值?
本人理科非計算機專業PHD,學習過c和fortran,可以熟練使用mathematica。很喜歡mma包含的函數式編程思想,因此想學一門有函數式編程特點的語言。不知道Julia是否是一個好的選擇?
佔個坑,畢竟打算各種安利Julia,關於Julia的很多中文內容都可以戳中文社區 http://julialang.github.com--------------------首先要確定的是你的需求是什麼,是要用一門能提高科研效率的語言還是想通過某一門語言來學習或者完整體驗函數式編程。如果是後者,我想 @小離Sidney的答案已經很清楚了。假設題主的目標是提高碼代碼的效率,提高可讀性以及程序執行速度。我打算用以下理由安利Julia...
我這裡列出了科學研究中的一些可能存在的需求(很有可能不全,所以還請指正)
- 矩陣計算
- 代碼的並行化
- 對一些成熟科學庫的支持
- 高性能
- 代碼的重用性(對一些編程範式的支持,如面向對象,函數式編程)
那麼Julia能做到嗎?回答當然是可以的。
首先Julia是一款很好上手的語言,你會發現Julia中能夠找到很多很多其它語言的痕迹,從它的開發目的上看,這也是必然的,因為它有一個目標,就是改善現在為了滿足不同需求使用不同語言的情況。從豆瓣上摘了一下中文版的 為什麼要開發Julia:1.矩陣計算Julia的矩陣計算默認是由openBLAS支持。openBLAS是一款開源的線性代數庫,開發者來自於中科院軟體所的張常有老師團隊。同時Julia也支持intel的MKL庫(如果你購買了intel的MKL的話)。所以正如Julia自己所號稱的一樣,Julia的矩陣處理性能是非常高的。2.並行然後是代碼的並行化,Julia的介紹中有這麼一句話:為分散式與並行而設計.可以看一下語法上也是原生支持並行的.簡單的說,因為我們很貪心。
我們是Matlab的重度用戶。我們中間有Lisp高手,Python專家,Ruby專家,還有Perl高手。有些傢伙從嘴上無毛的年紀就開始用
Mathematica了,當然我們中間也有人現在也還是不長鬍子的。我們比正常人畫了更多的R圖。C更加是我們最喜歡的大殺器。我們熱愛所有這些語言,他們實在是很好很強大。在我們從事的領域中——包括科學計算、機器學習、數據挖掘、大規模線性代數、分散式與並行計算這些——每種語言都對某些問題來說很完美,但對另一些就變得很糟糕。我們需要做出取捨。
我們很貪心:我們想要更多。
我們需要一種語言,它是開源的,有自由的許可。我們需要C語言的速度,又要有Ruby社區的活力。我們需要一種homoiconic風格的編程語
言,像Lisp那樣有真正的宏,又要有Matlab里那些熟悉的數學概念。我們需要的東西既能像Python那樣可以作為通用編程語言使用的工具,又要能
夠像R那樣適用於統計分析,能像Perl那樣自然地處理字元串,能像Matlab那樣給力地處理矩陣運算,還要能像shell一樣能把各種程序粘合在一
起。它必須讓初學者覺得簡單易學,同時又可以讓高級用戶們揮灑自如。它既要是互動式的,又能被編譯執行。(前面提到過的,它要有C那麼快!)
我們在構思這些需求的時候,我們還發現它得有Hadoop這樣強大的分散式能力——卻不想要Hadoop裡面那些冗繁的Java和XML,不想在幾
百台機器龐大的日誌文件里去尋找那些bug。我們不想要那些令人費解的層次結構。我們想讓簡單的標量循環能在單個CPU的寄存器里編譯出精緻的機器代碼。
我們想要寫一個A*B就能讓上千台機器為我們完成一次規模龐大的矩陣乘法。我們不需要的時候,就不用做類型申明。但我們需要多態函數(polymorphic functions)時,希望能通過泛型編程(generic
programming )使得只寫一次的演算法能在無窮多的數據類型上套用。我們希望通過多重分派(multiple dispatch
),能夠為一個函數所有可能的參數選出最有效的執行方法。這些參數可能有著不同的定義,來自不同的數據類型,卻能提供相同的功能。在擁有這些能力得的同
時,我們還希望這種語言簡單、乾淨!要求有點多,是不是?
儘管我們意識到了自己有多貪心,我們還是想把這些都統統擁入懷中。大概在兩年半之前,我們開始創造這種能滿足我們貪念的語言。它還沒有完工——但是
已經可以發布一個1.0版本了——我們創造的語言叫做Julia。她已經實現了我們那些亂七八糟需求的90%,而現在她需要來自更多人更亂七八糟的需求,
來讓她走得更遠。如果你也是一位貪心不足,不可理喻,需索無度的碼場二逼青年,希望你能來試試這個東東。
3.庫的支持
然後目前Julia已經有一些很好的庫了(以後不斷更新):- 數學優化方面有JuliaOpt,並沒學過數學優化但是據說寫的很好用。
- JuliaQuant量化庫,貌似樓下的答主在用
- 天文方面,JuliaAstro一個天文口的庫
- 在量子計算方面,由齊曉東@i2000s 發起的juliaQuantum已經能夠具有一些基本的功能,同時他們甚至有拿代碼去量子計算機上使用(當然並不是真的量子計算機,而是絕熱機)
- Mocha 一個很像caffee的機器學習庫
- JuliaGPU裡面有一些關於GPU計算的庫,一些著名的庫的wrapper,比如opencv(還只能在0.5-dev上調用,因為是調用了cpp)
- JuliaBio 生物信息(並沒有用過和我的專業不太相關)
JuliaCh.jl
當然這裡也會不定期更新這一部分。4.編程範式的支持
OO是支持的,採用的是多重派發.函數式編程,lambda表達式,閉包等也是有的.然後也有metaprogramming.由於Julia語言的誕生源自於兩個實驗室中,所以Julia首先是會要滿足實驗室科研的需求的(小道消息說,Julia的誕生是因為某計算化學大牛覺得MATLAB不好用,2333)同時它強大的目標,我想在1.0之後也能夠引起一大部分業界關注者的使用(然而一些生物信息的創業公司已經在用了呢)。同時相比MATLAB,mathematica,使用MIT協議的Julia,能夠為開發省去很多潛在的麻煩。也能夠更好的幫助學術上的交流,先寫到這裡。---5月1日, 將在深圳大學舉辦一次User Meetup, 歡迎關注中文社區 http://julialang.cn2016.4.2 更新Julia 最大的優點在於其速度和開源. 這點正是matlab和python無法取代的, 同時其語法基本接近python和matlab, 基本掌握了前者的想要學習julia都不會非常難. (當然一大缺點就是現在仍然在發展中, 一些包可能沒有python多, 但是Julia內部是可以直接調用python的任何庫的) 同時這也為同學們提供了一個比python 更廣闊的平台, 集成其他語言是非常容易的.
另外, 我在Github上開源了一個純Julia實現的機器學習演算法庫LightML.jl, 現在已經包含了Adaboost, 決策樹, gradient boosting, SVM, BP神經網路等近20種演算法. 由於該庫是純學習目的, 因此代碼沒有很多優化trick, 很容易可以讀懂, 每種演算法都帶了演示例子, 並可以直接通過test函數調用.
PCA
決策樹
由於該項目仍然在發展中, 因此也希望更多的人參與進來. 提issue或者pull request都非常歡迎~
如果該項目對你學習Julia語言, 機器學習等有幫助, 請記得給項目點個Star呀~
謝喵
Julia Language 除了坑很深以外,都是很棒的,如圖~ef{fig:我只不過掉進坑裡了} 所示。所以其實是否考慮 Julia lang 看你對坑的接受程度。當然 Julia lang 也可能並沒有那麼坑 (因為我不知道用 stable 版本的 julia 是什麼感受因為我一直是 checkout master 然後編譯安裝)
首先,沒有太大風險的回答是看你需求,你可以看看你有沒有這兩個痛點
(1.你要寫循環么(2. 不玩一發 AST 么
所以如果你需求不是很奇怪,也就是你不需要解一些 PDE ODE 之類的內容。或者說 R 已經可以足夠快的完成你的任務,那麼你完全用不著 Julia。Julia 現在一個賣點是寫循環足夠的快。
另外一個 Julia 的賣點,也就是函數式編程的賣點。我不太清楚 mma 是如何的做 functional programming 的。 如果只是 map, map + fold, fold , filter, iter 的話,其實很多語言都有。當然 julia 也有。但是 Julia 的另一個有點像 functional programming 是他的 metaprogramming。也就是其 macros 實際上乾的是操作 AST (abstract syntax tree) 。這其實很類似 Lisp 系列的宏,但是這東西我現在還玩不好。
最後,作為 型別 的一個附帶產物,你可以做 Policy-based programming,減少 bug。不過眾所周知的是,bug 這種東西對於科研工作者不太重要(逃
最後,如果想要用 Julia 而且想要用得比較爽的話,其實可以參考一些編程類的數據。侯捷的 STL 書可以算是一個針對用戶的型別系統與防禦式編程的簡單入門;然後關於如何操作 AST, 我暫時沒有比較好的入門教材。
另外入門者可以參考一下 pluskid 姐姐的代碼: Machine Learning and Optimization謝邀~~
我覺得學習哪個編程語言,一般都是靠自己選擇,畢竟各個編程語言都有好好介紹自己的特性。是否適合自己,是否是自己需要,最主要的還是自己是否喜歡,應該都能從這些介紹中得到答案。我估計大家遲遲未有回答,可能也是因為不好對此太做建議吧?反正我是不知道要如何評價的說。
就比如題主所問的 The Julia Language 在主頁上就已經對Julia本身做了很全面完整的說明。題主可以就這個介紹,憑自己的喜好慢慢決定吧~畢竟,題主另外,對於題主所說的「一門有函數式編程特點的語言」,我想再做多一點補充,從我使用Julia的體驗看,好像Julia並不是專門的函數式編程語言。如果想深入理解函數式編程, Haskell Language 或者 The Lisp Programming Language 我可能更喜歡一些,當然啦,因為特性不一樣,到底哪個更適合題主,還是要題主自己判斷,在這我只是對函數式編程語言做這麼一個補充。
希望看完這些編程語言的介紹,題主能決定好自己的選擇。
以上。Stephen Boyd來我們學校做了個關於凸優化的講座,講完之後一直在安利大家用Julia,偶像的安利怎麼能不吃(;`O′)o
我曾經是一名工科Ph. D,2014年開始學習julia,原因是matlab計算速度無法滿足我的需求。有對matlab很熟悉的功底在,我只用了一周就學會julia了,所以首先我要說的是,julia上手很快,學習它不會浪費你很多寶貴的時間。之後我博士期間所有代碼都是用julia寫的,我覺得julia最大的優點在於,1)開源免費 2)計算速度快,比matlab真心快的多 3)並行計算能力簡單強大 4)工具包發展迅速,不要多久大可趕上python、matlab。
綜合來說,學習(學了一定要用才有意義)julia是有價值的,相當於購買一支潛力股。
如果碰到什麼問題python不能解決的,而Julia又恰好解決得很好,
那就學julia吧。出現這種情況的概率想必很小當初為了爽快地用for循環,加上導師的安利,入坑了。中間有段時間因為多線程支持不好,很是覺得坑爹,但高級語言就沒有做好的(別忘了python的GIL)。接受了這個現實之後,Julia還真是一個解決問題的利器。
隨手寫的代碼性能基本能滿足大部分需求了,我們在整個庫的層次對比過,代碼執行時間確實是在C++的2倍以內。真要玩性能,還是得用C/C++,或者直接上GPU(Julia可以直接寫GPU代碼了)。
另外,以前的老問題plot現在也基本沒了,Plots包可以調用各種後端,完全可以滿足實際應用需求。
另外,NASA也要入坑了,你不跳一個?
JuliaComputing/TrainingNASA
Julia就是搞笑的,希望吸引Matlab的用戶,但是語法比c艹還複雜。
推薦閱讀: