<p>你可以使用字典来散列一些计算。代码多次计算A到B的距离(A和B是数据集中的两个任意点)</p>
<p>实现您自己的缓存:</p>
<pre><code>from math import radians, cos, sin, asin, sqrt
dist_cache = {}
def distance(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
try:
return dist_cache[(lon1, lat1, lon2, lat2)]
except KeyError:
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
km = 6367 * c
dist_cache[(lon1, lat1, lon2, lat2)] = km
return km
</code></pre>
<p>或使用<a href="https://docs.python.org/3.4/library/functools.html#functools.lru_cache" rel="nofollow noreferrer">lru_cache</a>:</p>
<pre><code>from math import radians, cos, sin, asin, sqrt
from functools import lru_cache
@lru_cache
def distance(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
km = 6367 * c
return km
</code></pre>