書名: Julia高性能科學計算(第2版)作者名: (韓)權昌賢(Changhyun Kwon)本章字數: 1259字更新時間: 2021-10-29 21:36:53
1.1 什么是Julia及為什么要使用Julia
Julia是一門非常新的語言,它主要擅長科學計算。開發(fā)Julia,是為了使科學計算更有趣、更高效。在計算機科學家和軟件工程師看來,Julia語言有很多優(yōu)點,你可以在官網(見參考資料[2])上了解這些。
這里援引了Julia的創(chuàng)造者在第一篇官方博客文章《為什么我們創(chuàng)造Julia》(見參考資料[3])中的一段話。
“我們想要一種自由的、開源的語言。它要像C語言(以下簡稱C)一樣快速,同時要有像Ruby那樣的動態(tài)語言的特性;要具有Lisp般的元編程能力而又有MATLAB那樣的數學符號輸入;要像Python般通用、像R般在統(tǒng)計分析上得心應手、像Perl般自然地處理字符串、像MATLAB般有強大的線性代數運算能力、像Shell般具有‘膠水語言’的進程管理能力;它要易于學習而又不讓真正的極客感到無聊;還有,它應該是交互式的,同時又是編譯型的……”
這就是Julia被創(chuàng)造的原因,用來滿足以上所有這些“貪婪的”愿望。
下面我來講講我的故事。在念研究生之前我做了幾年Java開發(fā)工作。我的第一份計算機家庭作業(yè)和課程項目自然是用Java寫的。在此之前,我本科的計算機家庭作業(yè)是用C寫的。上研究生不久,我開始用MATLAB,這主要是因為實驗室的其他研究生都在用MATLAB。我需要向他們學習,所以用了MATLAB。
我喜歡MATLAB。它不像Java和C,不需要在使用之前聲明每一個變量,在MATLAB里,變量可以直接使用。數組也不只是計算機內存里的數組,數組在MATLAB中像向量和矩陣。同時,計算結果繪圖也容易。對建模優(yōu)化問題,我使用GAMS,并與CPLEX這樣的求解器相連。雖然MATLAB-GAMS-CPLEX鏈也能滿足我的需求,但我不喜歡GAMS的語法——當時我不能完全理解這些語法——而且GAMS和MATLAB接口的速度很慢。盡管CPLEX提供與C、Java、Python的全面連接,但它與MATLAB卻只有基本的連接(不夠用)。
當我研究生畢業(yè)時,我認真考慮過是否要使用Python。它過去是,現在仍然是很多計算學家的一個普遍的選擇。CPLEX對Python的支持好過對MATLAB的支持。與MATLAB不同,Python是免費開源軟件。然而,當時我沒有轉向Python,而是決定繼續(xù)使用MATLAB。我個人不喜歡把0作為數組的首索引,就像C和Java里那樣。在Python里,首索引也是0。而在MATLAB里,首索引用的是1。例如,假設我們有這樣一個向量(為盡量保持原書的風格,本書中的矩陣、向量、字典、鏈接、節(jié)點等的名稱的樣式將與原書保持一致)。

在MATLAB里會被記成如下這樣。

向量的首元素應該用v(1)而不是用v(0)來訪問。第i個元素必須是v(i),而不是v(i-1)。因此我繼續(xù)使用MATLAB。
2012年,有人向我介紹Julia語言,它很吸引我,因為至少數組索引是從1開始的。做了一番調查研究后,我當時并沒有轉向Julia。因為它當時對建模和求解器優(yōu)化的支持太爛了。于是我繼續(xù)使用MATLAB。
2014年,我偶爾又讀了幾篇講Julia的博客文章和推特,我又更多地了解了Julia。于是發(fā)現了一個Julia建模優(yōu)化問題的包,叫作JuMP(Julia for Mathematical Programming,即數學編程Julia)。研究了幾個小時之后,我就愛上了JuMP,于是決定轉向Julia,這主要是為了使用JuMP。下面是我解決網絡優(yōu)化問題的部分代碼。

這簡直是下面的數學語言的直接“翻譯”。

其約束條件如下。

我認為這是非常明顯的“翻譯”。特別漂亮,對不對?
CPLEX和它的競品Gurobi通過JuMP與Julia的連接也都很順暢。我還有什么可猶豫的呢?現在,我已經使用Julia這么多年,我仍然熱愛它——我甚至為它寫了本書。
- Learn ECMAScript(Second Edition)
- 精通JavaScript+jQuery:100%動態(tài)網頁設計密碼
- 微信公眾平臺與小程序開發(fā):從零搭建整套系統(tǒng)
- The Android Game Developer's Handbook
- Learning Docker
- 劍指Offer(專項突破版):數據結構與算法名企面試題精講
- Machine Learning with R Cookbook(Second Edition)
- C語言程序設計(第2版)
- Processing互動編程藝術
- Python機器學習編程與實戰(zhàn)
- RSpec Essentials
- Java Web開發(fā)詳解
- Linux C編程:一站式學習
- Python編程:從入門到實踐(第3版)
- 深入淺出Python數據分析