<p>索引到location参数需要时间,而且对于所有一百万个节点,位置不会改变,所以请将这些不变量从for循环中取出:</p>
<pre><code>for NodeId, NodeLocation in node_location_by_nodeId.iteritems():
distance = (NodeLocation[0] - location_in_space[0])**2 +
(NodeLocation[1] - location_in_space[1])**2 +
(NodeLocation[2] - location_in_space[2])**2
if distance <= closest_distance:
closest_distance = distance
closest_node = NodeId
</code></pre>
<p>变成:</p>
<pre><code>x,y,z = location_in_space
for NodeId, NodeLocation in node_location_by_nodeId.iteritems():
distance = (NodeLocation[0] - x)**2 +
(NodeLocation[1] - y)**2 +
(NodeLocation[2] - z)**2
if distance <= closest_distance:
closest_distance = distance
closest_node = NodeId
</code></pre>
<p>现在它们变成了简单(更快)的本地值引用。你知道吗</p>
<p>您还可以尝试用对<code>math.hypot</code>的调用来替换距离计算,这是用fast C代码实现的:</p>
<pre><code>from math import hypot
x,y,z = location_in_space
for NodeId, NodeLocation in node_location_by_nodeId.iteritems():
distance = hypot(hypot((NodeLocation[0] - x), (NodeLocation[1] - y)),(NodeLocation[2] - z))
if distance <= closest_distance:
closest_distance = distance
closest_node = NodeId
</code></pre>
<p>(<code>hypot</code>只用于进行二维距离计算,因此要进行三维计算,必须调用<code>hypot(hypot(xdist,ydist),zdist)</code>。)</p>