当前位置: 首页 > 面试题库 >

Python:加快地理比较

闾丘卓
2023-03-14
问题内容

我已经写了一些代码,包括其中内环路约1.5万次执行的嵌套循环。我在这个循环的功能,我试图以优化。我已经做了一些工作,并取得了一些成果,但我需要查了一下输入,如果我在做什么是明智的。

一些背景:

我有两个地理点(纬度,经度)集合,一个相对较小的集合,一个相对较大的集合。对于小集合的每一个点,我需要找到大集合中的最近点。

最明显的方式做到这一点是使用haversine公式。这里的好处是,距离是绝对准确的。

from math import radians, sin, cos, asin, sqrt

def haversine(point1, point2):
    """Gives the distance between two points on earth.
    """
    earth_radius_miles = 3956
    lat1, lon1 = (radians(coord) for coord in point1)
    lat2, lon2 = (radians(coord) for coord in point2)
    dlat, dlon = (lat2 - lat1, lon2 - lon1)
    a = sin(dlat/2.0)**2 + cos(lat1) * cos(lat2) * sin(dlon/2.0)**2
    great_circle_distance = 2 * asin(min(1,sqrt(a)))
    d = earth_radius_miles * great_circle_distance
    return d

然而,运行这个150万次(根据timeit)把我的机器上约9秒。由于具有精确的距离是不重要的,而我只需要找到的最近点,我决定尝试一些其他的功能。

一个简单的实现勾股定理给我的约30%的速度提升。以为我可以做的更好,我写了下面:

def dumb(point1, point2):
    lat1, lon1 = point1
    lat2, lon2 = point2
    d = abs((lat2 - lat1) + (lon2 - lon1))

这给了我10改进的一个因素。不过,现在我担心,这将不保留三角不等式。

所以,我的最后一个问题是双重的:我想有一个功能,运行快,dumb但仍然是正确的。会dumb工作吗?如果没有,就如何提高我的半正矢函数有什么建议?


问题答案:

您可以考虑某种图形哈希,即快速找到最接近的点,然后对其进行计算。例如,你可以创建一个统一的网格,并分发(的大集合)的点是由网格创建的垃圾箱。

现在,具有与小集合点,你需要处理点小得多量(即是在相关箱只)



 类似资料:
  • 问题内容: 我想使用Biot- Savart定律 来计算某些导体的磁场,并且我想使用1000x1000x1000的矩阵。在使用MATLAB之前,但现在我想使用Python。Python比MATLAB慢吗?如何使Python更快? 编辑:也许最好的方法是使用C / C ++计算大型数组,然后将其传输到Python。然后我想用VPython可视化。 EDIT2:在我的情况下哪个更好:C还是C ++?

  • 问题内容: 我有一个用Python和Haskell编写的简单脚本。它读取一个由1000000个换行符分隔的整数的文件,将该文件解析为整数列表,对其进行快速排序,然后将其写入另一个已排序的文件中。该文件与未排序的文件具有相同的格式。简单。 这是Haskell: 这是Python: 非常简单。现在我用以下代码编译Haskell代码 我给这两个时间计时: 结果: Haskell: 蟒蛇: Python如

  • 问题内容: 我一直认为Python的优势在于代码的可读性和开发速度,但是时间和内存的使用却不如C ++。 这些统计数据让我非常震惊。 您的经验告诉您关于Python与C ++的时间和内存使用情况? 问题答案: 我认为您错误地读取了这些统计信息。他们表明,Python比C ++ 慢 大约400倍,除了一个案例,Python更像是一种内存消耗。不过,就源代码大小而言,Python胜出。 我的Pytho

  • 问题内容: 在Python的性能方面,是一个列表理解或功能,如,和比for循环快?从技术上讲,为什么它们以C速度运行,而for循环以python虚拟机速度运行? 假设在我正在开发的游戏中,我需要使用for循环绘制复杂而庞大的地图。这个问题绝对是相关的,例如,如果列表理解确实确实更快,那么它将是避免滞后的更好选择(尽管代码具有视觉复杂性)。 问题答案: 以下是粗略的准则和基于经验的有根据的猜测。你应

  • 问题内容: 在优化代码时,我意识到了以下几点: 并且: 我认为它与在C中实现python的方式有关,但我想知道是否有人愿意解释为什么会这样? 问题答案: 结果的(有些出乎意料的原因)是Python似乎折叠了涉及浮点乘法和幂运算而不是除法的常量表达式。完全是另一种野兽,因为没有字节码,并且涉及函数调用。 在Python 2.6.5上,以下代码: 编译为以下字节码: 如您所见,乘法和乘幂根本不需要时间

  • 问题内容: 我可以在网上(在Stack Overflow上以及其他方面)找到大量有关使用Python或在Python中进行连接是一种非常低效且不好的做法的信息。 我似乎找不到为什么效率如此低下。在这里没有提到“在某些情况下已针对20%的改进进行了优化”(仍然不清楚这些情况是什么),我找不到任何其他信息。 在比其他Python串联方法更好的技术水平上发生了什么? 问题答案: 假设您有这段代码可以从三