用Go替代Python在生產環境中進行數據分析

數據分析

介紹

目前,計算機領域正在從IT時代向DT時代迅速演進。

IT時代,就是信息科技時代。是用信息技術改善工作效率。

DT時代,就是數據科技時代。根據數據進行決策,改善決策效率。數據科技正在顛覆一個又一個行業的格局。最近幾年,數據科學家這個新職位也成爲了職場上最熱門的職位。

 

根據數據進行決策,這個工作可以分爲兩個部分,一個部分是數據的採集、整理、加工和處理,另一部分是使用統計學、機器學習、人工智能等的模型從數據中提取知識進行決策。

 

數據和數據之間的關係,決定了基於數據決策的效果的理論上限。模型,只能無限逼近這個理論上限。

而且,現實中,簡單和複雜的模型,其實際效果相差都不大。因此,如何蒐集數據、處理數據、加工數據、分析數據,這樣的髒活和累活,其實才是數據科學工作中最重要的工作,也是工作量最大的工作。設計模型相對來說沒有那麼重要。

 

目前,數據處理和分析,主要使用的是Python語言,也有一些統計學背景的從業者使用R語言。當然,也有人使用SAS,SPSS,Matlab等付費語言和軟件。

 

Python語言中,numpy和Pandas庫更是數據分析的神器。簡單、靈活、強大。

 

探索性的數據分析和生產環境中的數據分析

但是,Python用於數據分析,也有一些問題。Python作爲一門動態語言,有很多表現力強大的語法糖,開發效率非常高,但運行效率很低。而且Python語言對多線程的支持並不好。

 

日常進行一些探索性的數據分析,Python是非常實用的工具。Python開發效率高,可以快速編寫出多個版本的代碼,進行數據探索,尋找內部規律。

 

但是,一旦在生產環境中部署Python數據分析程序,就會暴露出Python程序運行性能低的問題。生產環境中併發訪問量有時可能很大,如果部署Python的數據分析程序,由於其性能較低,需要部署大量節點,使用大量計算資源來滿足併發需求。這成本就比較高了。

而且即使部署大量資源,由於Python程序性能較低,也難以滿足某些要求快速響應的業務場景。

 

那麼,有沒有什麼適合數據分析且運行效率高的語言呢?R語言行不行呢?抱歉,R語言雖然也非常適合編寫數據分析程序,但是R語言的運行效率比Python語言還低。

 

我發現Go語言,是替代Python進行高性能數據分析非常適合的語言。

 

Go語言

 

介紹

Go語言(又叫Golang,因爲在Go語言剛發佈時,用Go很難在搜索引擎搜索到Go語言的信息)是Google公司在2007年推出的一門靜態編譯型語言。Go語言誕生的目的,是爲了作爲C語言的補充,是爲了取代C++。主要目的是爲了編寫後端程序。Go語言官方至今都沒有推出過前端開發框架。當然,你現在也可以找到一些第三方用Go語言開發的前端開發框架。GTK,QT等都有Go語言對應的版本。

 

Go語言的設計思想,就是簡單。Go語言只有25個關鍵字。Go語言最強調的就是簡單性,我估計可能是爲了和C++反着來吧。衆所周知,C++是一門非常複雜,並且複雜性在不斷攀升的語言。C++的複雜性帶來了很多問題。

 

Go語言是C語言的後繼。從其設計來看,非常接近C語言,只是給C語言增加了少量功能而已。基本上就是給C語言添加了一些現代編程需要的少數特性:對象,接口,多返回值,協程,channel,切片,字典,垃圾回收器,閉包,錯誤管理,跨平臺等。

 

Go語言是一門靜態編譯型的語言,生成的是機器碼,因此其程序運行效率非常高,接近C。Go語言的語意表達能力沒有Python強,也沒有Python那麼多語法糖,因此其開發效率比Python略低,完成同樣的功能需要編寫稍多一些的代碼。但權衡開發效率和運行效率後,我認爲用Go替代Python在生產環境中進行數據分析,是非常正確的決定。

 

Go語言的數據分析庫

Python中的numpy和pandas,在Go語言中也有對應的開源軟件:gonum和gota。gonum和gota,比numpy和pandas的性能要強很多。

 

Go語言和Python語言的性能對比

Go語言和Python語言一般性能對比

我在網上找到一份Go語言和Python3在一些測試用例上的性能測試對比報告。

在上述測試報告中,大部分測試用例下,Go語言程序要比Python語言程序快40多倍。

 

Golang Gota和Python Pandas性能對比

我們知道,在測試用例下表現好,不一定代表真實場景下表現也一樣好。

 

因此,我分別用Python3的pandas和Golang的gota編寫了一個簡單的數據分析程序,模擬現實中的數據分析問題,對兩者的性能進行了對比測試。

測試程序做了三件事情:

1,從json字符串創建數據幀(就是一個表)對象

golang比python快84倍。

 

2,對數據幀的每一行累加後做平均

golang比python快218倍。

 

3,對數據幀的每一行累加後做平均,再把結果作爲新的列添加進數據幀

golang比python快61倍。

 

因爲gota底層用的是gonum,pandas底層用的是numpy。所以,我沒有對gonum和numpy單獨執行性能對比測試。上述性能對比結果應該能夠代表gonum和numpy的性能差異。

 

用Go替代Python在生產環境中進行數據分析

通過以上對比,我們看到Go語言在進行數據分析時,其運行效率比Python要高出2個數量級。如果在生產環境中,需要部署100臺服務器運行Python程序以滿足業務需要。那麼如果使用Go語言編寫數據分析程序,則可能只需要1、2臺服務器就夠了。並且能夠滿足某些要求響應時間非常短的業務場景。

而且,Go語言的開發效率也沒有比Python低太多。這買賣划得來!

 

但也不是說,以後我們就只需要用Go語言進行數據分析了。

在執行探索性數據分析任務時,通常執行一次程序後,就需要修改很多代碼,然後再重新執行程序看下結果。這個過程需要重複很多輪。這種場景下,用高開發效率的Python編寫程序是更合適的選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章