繁体   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