<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python高性能空間數(shù)據(jù)計算包:PyGEOS

          共 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
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一级aa视频 | 乱伦大香蕉~ | 高清操逼大片 | 强开小嫩苞毛片一二三区 | 免费日韩三级片 |