Python 用於科學資料視覺化
背景
MayaVi 是一個完全用 Python 編寫的開源科學資料視覺化工具。
我於 2000 年開始開發 MayaVi。當時,我的幾位同事需要視覺化他們的計算流體動力學 (CFD) 資料,但唯一可用的合適工具是商業的、閉源的程式,價格極其昂貴。
我們研究了一些開源工具作為替代方案。OpenDX 剛剛向公眾釋出,當時我很難讓它啟動並執行。OpenDX 也是一個相當複雜的系統,學習曲線陡峭。
另一個視覺化/圖形庫 VTK 也是開源的。VTK 是一個非常強大的視覺化庫,用 C++ 編寫。它具有很強的可移植性,可以在各種 Unix 版本、Windows 以及最近的 Mac OS X 上執行。
VTK 被選為最合適的解決方案,但它不足以解決手頭的問題。在非程式設計師僅具備特定領域知識就可以坐在電腦前視覺化他們的資料之前,需要在 VTK 庫之上開發一個應用程式。
選擇 Python
儘管我之前的大部分經驗都在 C 和 C++ 方面,但我認為另一種語言可能是快速開發圖形使用者介面的更好選擇。VTK 是用 C++ 編寫的,但也為 Python、Tcl 和 Java 進行了封裝。我研究了這些語言。
我排除了 Tcl,因為我感覺 Python 的語法更清晰,並且我聽說大型 Tcl 程式很難維護。Java 的缺點是每次更改程式碼都需要編譯,而且對於這個專案來說,在任何最近的瀏覽器中執行程式碼的能力都沒有用處。與 Python 相比,Java 繁瑣的語法也是一個缺點。Python 與 Java 一樣具有可移植性,而且是一種更容易學習和使用的語言。我還讀過 Python 教程,看過各種 Python 程式,並且非常喜歡這門語言的簡潔性、面向物件的特性、動態資料型別以及龐大的標準庫。
從使用 VTK 的一些簡單的 Python 指令碼開始,我能夠讓我的同事們相當快地執行一些自定義的 CFD 視覺化指令碼。那時我還在學習 Python 和 Tkinter(MayaVi 中使用的 GUI 工具包),並在 2000 年 6 月建立了一個名為 VTK-CFD 的基於 GUI 的工具。這個工具經過了幾輪改進,直到我最終完全重寫了它並在 2001 年 5 月釋出了 MayaVi。
結果
MayaVi 是用 100% 純 Python 編寫的,並且憑藉 VTK、Python 和 Tkinter 的可移植性,它可以在 Linux、Unix 和 Windows 上執行。Python 被證明是簡單、易學且功能極其強大的語言。它的互動式直譯器在學習和實驗時是一個巨大的優勢。它還有優秀的免費文件。
我發現開發週期非常快,因為 Python 既是面向物件的又是解釋型的。該程式可以從面向物件的角度進行精心設計,從而更易於維護,但每次更改程式碼時都不需要等待編譯。
Python 的可讀性和動態型別使得編寫、維護和擴充套件程式碼更加容易。我從不需要擔心型別,這讓我專注於手頭的問題,而不是與語言及其語法作鬥爭。這使得我的工作效率比使用 C 和 C++ 時高得多。例如,我只用了 400 行程式碼就編寫了一個完整的帶有 GUI 和搜尋引擎的 VTK 文件瀏覽器。

圓柱形柱體後的流動,顯示配置對話方塊、VTK 管道和 VTK 文件瀏覽器。資料由 NASA 提供。 放大
對內省的優秀支援,加上全面的標準庫,使得編寫像 vtkPipeline 瀏覽器這樣的資料驅動程式碼變得容易。這會在執行時自動生成一個 GUI,顯示 VTK 圖形管道。它還透過使用 Python 的正則表示式模組解析物件的方法、對其進行分類並相應地構建 GUI,為任何 VTK 物件生成 GUI 配置對話方塊。此程式碼也用於 MayaVi 的永續性機制,該機制可以透過在執行時檢查大多數 VTK 物件來將其儲存到磁碟。使用內省來編寫此類資料驅動的模組避免了大量的體力編碼,並使 MayaVi 隨著更多 VTK 物件的定義而自我擴充套件。
由於 Python 是一種指令碼語言,因此它是 MayaVi 擴充套件語言的自然選擇。因此,MayaVi 不僅是用 Python 編寫的,還可以由使用 Python 的終端使用者編寫指令碼,以便使用其他有用的功能對其進行擴充套件。
我不是軟體開發人員或計算機科學家。我也不是圖形專家。雖然我在 C/C++ 方面確實有相當多的程式設計經驗,但在開始這個專案時,我對 Python 的瞭解很少。然而,我只使用 Python 的教程和標準 Python 文件就能夠學習 Python,然後可以快速開發一個實質性的應用程式。我很高興 Python 如此容易學習,然後如此容易地應用於重要的任務。
需要注意的是,這個專案對我來說只是一個業餘活動,這意味著我沒有持續的時間來完成它。我是唯一的開發人員,我必須編寫程式碼、維護網頁、編寫文件並獨自回答使用者問題。
即便如此,我還是在相當於大約 4 個月全職工作的時間裡編寫了大約 16,000 行 Python 程式碼,併產生了一個成功的最終產品。這項工作分佈在約 5 個版本的 VTK-CFD 和 3 個版本的 MayaVi 上。MayaVi 已從 SourceForge 下載超過 12,000 次,其中在三個月的時間裡最新版本的下載量超過 3,500 次。現在,全世界有成千上萬的使用者在許多研究領域應用 MayaVi。它最近已為 Debian Linux 打包,幷包含在其最新版本 Woody 中。
結論
如果不是 Python,MayaVi 將不會存在。使用 Python 程式設計是一種樂趣,而且非常容易,即使是一個業餘專案也可以非常成功地完成其設定的目標。沒有重大的移植問題,MayaVi 在 Linux、Unix 和 Windows 下執行良好,我對其進行的修改非常少。總的來說,使用 Python 是一種非常棒的體驗。我學到了很多東西,在使用它時變得非常有成效,並且希望我也能透過我所編寫的工具讓其他人富有成效。
關於作者
Prabhu Ramachandran 是印度馬德拉斯印度理工學院的一名航空航天工程師和博士生。作為 OSS 和 GNU/Linux 的倡導者,Prabhu 還為 VTK(MayaVi 基於的開源 3D 計算機圖形、影像處理和視覺化系統)做出了貢獻。