Python高性能空間數(shù)據(jù)計算包:PyGEOSPython大數(shù)據(jù)分析關(guān)注共 2163字,需瀏覽 5分鐘 ·2021-04-20 01:58 今天早上在查閱GeoPandas文檔的時候,發(fā)現(xiàn)從0.8版本開始,多了一個新特性:可以在GeoPandas進行空間運算的時候,選用PyGEOS包來實現(xiàn)了。算法渣渣蝦看見這個選項的時候,當時的表情那是:好吧,有同學不知道為什么蝦神會如此驚訝,因為這個庫實在是太流弊了……今天我們就來介紹一下這個神奇的高性能空間數(shù)據(jù)計算包:PyGEOS話說,對速度的追求,是人類的本能:當然,你可以追求更快,自然也可以追求更慢……但是在對數(shù)據(jù)進行計算的時候,無疑我們是追求更高更快更強的……而這個包,敢叫做“高性能”,自然有它的兩把刷子。我們先來看看官方文檔對它的描述:蝦神大白話解釋如下(英文好的同學自行去讀官方文檔):第一點,PyGEOS這個包,底層的計算,用的GEOS的空間關(guān)系來進行計算,好吧,我知道有同學繼續(xù)會問,啥是GEOS呢?這個說來就話長了,看下面這張圖:閉源的先不看,主要看開源的部分,通常說的就是C/C++寫的速度快,但是對于碼農(nóng)來說很不友好,反之JAVA寫的,對碼農(nóng)友好,但是速度效率又不咋地……所以,綜合了二者的優(yōu)點以及缺點之和,就出現(xiàn)Geos這個東西……它有著C++底層的運行速度,但是在API保留了JAVA編碼友好的特點——but,二者的缺點也一并保留了。目前用GEOS比較出名GIS軟件,就是QGIS平臺。GEOS搞出了空間關(guān)系計算里面最出名的入門圖DE-9IM(Dimensionally Extended nine-Intersection Model (DE-9IM),用于描述兩個幾何圖形空間關(guān)系:——言歸正傳,回到PyGeos。因為PyGEOS底層用的是GEOS,所以它具備了空間計算的各種基本以及標準的功能。第二點,PyGEOS計算操作,利用的是numpy的ufunc模式進行編碼——所謂的ufunc模式,是一種在n維數(shù)組上,以逐個元素處理的方式運行的函數(shù),支持數(shù)組廣播(廣播是指 NumPy 在算術(shù)運算期間處理不同形狀的數(shù)組的能力)。它的機制是使用C語言對底層for循環(huán)進行了重寫,從而減少了Python解釋器的開銷。舉個例子:傳統(tǒng)的迭代計算,比如我這有一個5個元素組成的數(shù)組,要把每個元素擴大3倍,正常的代碼寫法應(yīng)該是通過for循環(huán),一個個元素來處理:但是在Numpy里面,直接用ufunc方式來實現(xiàn),直接在數(shù)組上乘以3,得到的結(jié)果是每個元素依此乘以3了:numpy的速度之所以比傳統(tǒng)Python數(shù)組快那么多,有個核心原理就是他的ufunc,采用的是C重寫了底層,不需要在Python那個蝸牛一樣的解釋器里面去運行,而PyGEOS 也用了這個原理,來實現(xiàn)快速計算。第三點就是PyGEOS支持多線程。原理就是它在函數(shù)執(zhí)行期間主動干掉了GIL(Global Interpreter Lock :全局解釋器鎖定)。GIL這個東東是C語言里面的一個特性,而我們的CPython天生就帶著這個東西出現(xiàn)了(相對的Jython就么有GIL),它主要的作用就是一個全局排他鎖,主要是防止多線程并發(fā)執(zhí)行機器碼(C語言官方的解釋是為了解決線程間數(shù)據(jù)一致性和狀態(tài)同步的困難,而解決思路很粗暴:特么我加一把鎖鎖起來,你們之間就無法同步了,自己跑自己的進程完事——完美解決)。而在 PyGeos中,因為用的是C語言重新寫的底層,所以在底層函數(shù)在內(nèi)部釋放了此約束,帶來的結(jié)果就是通過單個Python進程就可以并行完成GEOS計算的任務(wù)。下面我們來看看PyGEOS的車速到底有多快:首先,以北京周邊為范圍,生成了10萬個隨機點:然后我們分別用PyGEOS和GDAL迭代的方式,來進行一個包含查詢:恩,花了11秒,查出來了42765個——好像不怎么快嘛。接下去,我們用GDAL/OGR的方式來做一下:在OGR下面,用了差不多要比PyGEOS多用2倍的時間!!效果卓然拔群!恩,Python本來就比較慢……這個是共識,但是這才10萬個點,就算快也得11秒,那也太慢了……還有快點的方法么?做為程序員,當然不能說有問題:下面我們來看,空間數(shù)據(jù)計算加速的主要方法之一:空間索引——PyGEOS的空間索引能力:——見證奇跡的時刻:只用了39ms!比自身直接查詢快了363倍,而比用GDAL/OGR迭代快了664倍。我們來弄個大點的數(shù)據(jù),比如100萬個點:完成了100萬點的包含查詢,查詢出來了42萬6431條數(shù)據(jù),耗時為1.36秒(好吧,我覺得有這個速度已經(jīng)很快,但是還有同學說有些慢,因為我們在這里不是對標以快為標準的數(shù)據(jù)庫——如果是空間數(shù)據(jù)庫,千萬點級別的查詢,可以控制在零點幾秒以內(nèi)……這個我們就不對標了——別忘記了,我們這是在以慢出名的Python里面)本節(jié)打完收工,下一節(jié)我們看看在GeoPandas里面怎么用PyGEOS· 推薦閱讀 ·關(guān)于pip的15個使用小技巧秀啊,用Python快速開發(fā)在線數(shù)據(jù)庫更新修改工具99%的Python用戶都不知道的f-string隱秘技巧 瀏覽 55點贊 評論 收藏 分享 手機掃一掃分享分享 舉報 評論圖片表情視頻評價全部評論推薦 Python高性能空間數(shù)據(jù)計算包:PyGEOS在Geopandas中的使用Python大數(shù)據(jù)分析0MPI.NET高性能計算框架.Net實現(xiàn)的MPI高性能計算框架Cubert高性能計算引擎Cubert 是一個用于復(fù)雜大數(shù)據(jù)分析的高性能計算引擎。這是為分析師和數(shù)據(jù)科學家編寫的一個框架,提供AMD:高性能計算 (HPC)架構(gòu)師技術(shù)聯(lián)盟0Cubert高性能計算引擎Cubert是一個用于復(fù)雜大數(shù)據(jù)分析的高性能計算引擎。這是為分析師和數(shù)據(jù)科學家編寫的一個框架,提供“手動編寫Java程序的所有效率優(yōu)勢,并提供了一個簡單的、類似腳本的用戶接口,用于解決各種統(tǒng)計、分析和并行計算與高性能計算并行計算與高性能計算0并行計算與高性能計算編寫可擴展的、快速、強大、節(jié)能的程序,才適合處理大量數(shù)據(jù)。使用并行編程,可將數(shù)據(jù)處理任務(wù)分布在多個CAMD:高性能計算 (HPC)智能計算芯世界0Python高性能編程Python高性能編程0Python高性能編程本書共有12章,圍繞如何進行代碼優(yōu)化和加快實際應(yīng)用的運行速度進行詳細講解。本書主要包含以下主題:計算點贊 評論 收藏 分享 手機掃一掃分享分享 舉報