簡體   English   中英

Python 性能問題:兩個多邊形之間的差異

[英]Python performance problem: difference between two polygons

我目前正在使用 Python 3.7,我想找到很多多邊形之間的區別。 我的意思是,如果我有一個多邊形A和一個多邊形B,我想做數學“A not B”運算。 此操作有兩種可能的結果,如下圖所示:

在此處輸入圖片說明

所以我相互減去(“切割”)的兩個多邊形要么給我一個新的多邊形,要么是空的。 所有其他情況都可以忽略。 對於情況 1,多邊形的形式不需要精確。因此,如果多邊形稍有變化也是可以接受的。

對於案例 2,我需要知道多邊形是否為空。

此外,多邊形 A 和 B 中沒有任何“洞”,因此只能通過它們的外邊界來描述它們。

我已經構建了一個原型,它使用shapely 的difference操作來做到這一點。 我盡可能少地“切割”(每兩個多邊形一次)。

我的代碼有點復雜,但基本上可以分解為這個簡單的函數:

def cut_hole(A : Polygon, B : Polygon) -> Polygon:
    """
    Cuts a "hole" into shapely polygon A
    :return: The polygon resulting of the operation A-B. Might be empty!
    """
    outer = A #not in my code, just to point out what I mean
    inner = B
    return outer.difference(inner)

現在我的問題是這很慢! 我每批次處理大約15.000 個操作(30.000 個多邊形),我需要大約 10 到 15 分鍾來計算它們。 我真的很想縮短到 5 分鍾以內。

請記住,這並沒有考慮到所有其他操作。 15 分鍾僅用於差異操作。 我可以在 1 分鍾內將每個多邊形 A 排序到每個多邊形 B。 我只需要一種快速的方法來從中獲取生成的多邊形。

我用一台“好”的電腦(英特爾酷睿 i7,16 GB 內存)做了這個測試。 CPU 或 RAM 都未達到極限。

所以最大的問題是:我怎樣才能加快速度?

有沒有辦法將多邊形轉換成更容易處理的形式? 或者有沒有“更好”的方法來獲得兩個多邊形的差異?

有沒有更好的替代圖書館? 或者我可以使用其他硬件嗎? 如果是這樣,那可能是哪種硬件?

最后,我的下一步是嘗試並行化“切割”。 有沒有內置的方法可以快速有效地做到這一點? 因為我沒有找到一個身材勻稱的。

此外,我將非常感謝有關分析可能瓶頸的提示。

附錄:

一些多邊形似乎相當復雜。 我的意思是,更復雜的多邊形平均包含 15.000 個點。 不復雜的多邊形少於 100 點。 然而,通常(如 99%)多邊形類型 A 或類型 B 並不復雜。

這是 WKT 中復雜多邊形的示例

按順序排列你的分數:

  • 我非常懷疑還有另一種更適合在 python 中操作多邊形的格式/庫而不是 shapely,它是參考包。 您可以嘗試simplify幾何圖形,但一些快速測試表明它也是一個緩慢的操作( p是您在上面復制粘貼的多邊形):

     p2 = p.buffer(-10) # creating a 2nd polygon %timeit p.simplify(1) # 58.4 ms, from 15000 to 8000 points %timeit p.difference(p2) # 53.2 ms %timeit p.difference(p2.simplify(1)) # 127ms %timeit p.simplify(1).difference(p2) # 114ms
  • Shapely 在幕后使用GEOS 也許您可以嘗試朝那個方向挖掘較低級別的解決方案。

  • shapely 沒有平行性。 但是,由於您的“As”和“Bs”多邊形似乎已經匹配,因此您可以通過線程池或進程池(請參閱多處理包)並行化勻稱操作。 如果它們不匹配,你可以通過intersects快速檢查它(比intersectiondifference快得多。如果你的一些多邊形不相交,那將是一個巨大的加速。

  • 考慮到您的數據大小(5GB 是很多幾何圖形......),我認為除了並行化之外,您無法節省那么多時間,因為一個difference需要約 70 毫秒,這使得 15000 次操作需要約 1050 秒 = 17 分鍾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM