標籤:

究竟使用什麼語言去計算?

很抱歉,最近一直在忙著提升之前寫的一個ETL系統的性能,所以沒空寫一些理論的文章,近期我有空了會寫一些理論的文章。

正好在等我燒的咖喱冷卻,就寫個小隨筆,記錄一下我踩的大坑們。

在踩了無數的坑以後,我今天來和大家說一下究竟用什麼語言去計算才是墜吼滴。

我先給個容易引戰的結論:是Scala+Java等JVM系的語言(多麼痛的領悟)。

其實我是個很堅定的Py黨,Py2,Py3都行,但是我想說的是:Python其實並不適合做大規模的,對性能有要求的計算。

首先是Python的GIL的問題,這個問題直接導致了沒法使用多核,這個在ETL系統中是一個致命的問題,拋開GIL,我們能不能使用MultiProcessing或者JIT來規避這個問題呢?

首先,MultiProcessinging是一個解決方案,但是不是最好的,在開發的時候好像戴著枷鎖在戰鬥(共享問題)。

我之前寫一個高並發,而且需要後處理的爬蟲的時候就用了MultiProcessing技術,可以說,對於分立的任務,使用MultiProcessing可以比較好的利用多核。

再說說JIT,numba,Pypy,乃至於用Jython,IronPython我都折騰過了,因為想用scipy的稀疏矩陣,所以最後沒有一個能用的,唯一能稍微結合進項目的是numba的jit裝飾。

最後說一下,這個項目是使用HBase作為數據存儲的,所以使用JVM系的語言也不奇怪,更重要的是,負責框架的同志用了Scala作為新的ETL框架的開發語言,而我寫的舊框架(也能用就是了)因為當初的介面問題用的是Java。

最後我用Python做了什麼呢?

我用Python做了二次聚集和展示數據的網站,Django + Bootstrap搭建的,這個時候一些輕量的計算我會使用Python直接完成,看著做大規模查詢的時候CPU局限在8%(12核心)也是很心痛的……

最後說一些見仁見智的東西:

1、Python的函數式編程(lambda表達式,map,reduce,filter等)用起來不如Scala順手,哪可能大多數的函數都是一行呢?事實上大多不止一行。

2、Python的C庫豐富,這也是為什麼我喜歡Python的原因,有大量高效的C庫使用,給人一種Python不慢的假象……但是,這些庫很大的造成了我做移植的問題,比如Win上的程序到Linux上跑的時候……

3、要是Python能在JVM上運行,然後C庫用JNI的方式訪問也能順利調用那就是天國啊哈哈!!!

4、其實我不喜歡Scala,不喜歡的原因之一是很多地方要寫類型。和Py的「類型是什麼能吃嗎」的態度比起來,還是遜色許多(當然比Java已經好多了,var和val能推大部分的類型)。

5、我猜會有很多人來罵,說Python/PHP/C++是最好的語言,我用的不好是因為不會用,我承認我編程水平不高,沒有高到可以無視語言本身帶來的問題的地步,在當前項目下,在我公司當前大多數程序員的水平下,這個是目前我能確定的最優方案。

6、好吧,PHP才是世界上最好的語言。


推薦閱讀:

又是一道入群題(Scala)
Dotty 開發環境搭建
在 Dotty 中模擬 Kotlin (1) —— 標籤返回
如何評價 scala native?

TAG:Python | Scala | ETL |