我需要帮助优化我的代码。这是有问题的卑鄙功能。
def FindAllNeighborCoords(cardinal_neighbor_array, principle_neighbor_array, width, height):
# Loop through every coordinate on the map.
for x in xrange(width):
for y in xrange(height):
# These if checks make sure the coordinate is in the map.
if x - 1 >= 0:
cardinal_neighbor_array[x, y].add((x - 1, y))
principle_neighbor_array[x, y].add((x - 1, y))
if y - 1 >= 0:
cardinal_neighbor_array[x, y].add((x, y - 1))
principle_neighbor_array[x, y].add((x, y - 1))
if y + 1 < height:
cardinal_neighbor_array[x, y].add((x, y + 1))
principle_neighbor_array[x, y].add((x, y + 1))
if x + 1 < width:
cardinal_neighbor_array[x, y].add((x + 1, y))
principle_neighbor_array[x, y].add((x + 1, y))
if x - 1 >= 0 and y - 1 >= 0:
principle_neighbor_array[x, y].add((x - 1, y - 1))
if x - 1 >= 0 and y + 1 < height:
principle_neighbor_array[x, y].add((x - 1, y + 1))
if x + 1 < width and y - 1 >= 0:
principle_neighbor_array[x, y].add((x + 1, y - 1))
if x + 1 < width and y + 1 < height:
principle_neighbor_array[x, y].add((x + 1, y + 1))
print cardinal_neighbor_array[20, 20]
set([20, 21), (21, 20), (19, 20), (20, 19)])
此函数循环遍历地图上的每个坐标,找到邻居坐标周围的邻居并将其保存到集合中。它搜索两个邻居类型 - 基数和主要。或者,4和8.每组放置在2D阵列中。然后,我可以通过执行类似cardinal_array [0,0]的操作来获取坐标的邻居,这将返回一组坐标。我希望这是有道理的!我在我的项目中使用邻居TON,所以一次查找并存储它们的速度更快,而不是重复查找它们。我的引擎的巨大部分使用这些邻居集,所以我宁愿加快它目前的工作方式,而不是做出任何重大改变。这些集由包含每个邻居的(x,y)坐标的元组组成。如果你有更好的解决方案,可以改变元组的东西。该函数在映射生成期间调用一次,到目前为止最慢。
答案 0 :(得分:0)
有一些显而易见的事情要做。 if x - 1 >= 0
之类的所有语句都应替换为if x > 0
,因为这样可以节省额外费用。一旦你确定了像x > 0
之类的表达式的真值,如果你以后需要它,请使用该结果。例如:
if x > 0:
cardinal_neighbor_array[x, y].add((x - 1, y))
principle_neighbor_array[x, y].add((x - 1, y))
if y > 0:
principle_neighbor_array[x, y].add((x - 1, y - 1))
if y < height-1:
principle_neighbor_array[x, y].add((x - 1, y + 1))
您可以改进上面的最后一个if
语句:在第一个循环开始之前声明变量hm1 = height-1
,并在必要时在循环内使用该变量。否则,一次又一次地计算height-1。 Python不会为你优化这类事情。
这些相对较小。我看到的一个大问题是你在内循环中进行了12次数组查找。像principle_neighbor_array[x, y]
这样的每个表达都涉及到二维数组的查找,这必然是昂贵的。因此,在内部循环的顶部,声明两个局部变量,这些变量是您要使用的集合的同义词:
for x in xrange(width):
for y in xrange(height):
cardinal_set = cardinal_neighbor_array[x, y]
principle_set = principle_neighbor_array[x, y]
重写循环中的所有代码以使用这两个集合。每次迭代可以节省十个数组查找。
我不知道这会有多大帮助,但这很容易做,肯定会有所改善。
答案 1 :(得分:0)
您执行的操作数量是所需数量的2倍。
如果A是B的邻居,那么显然B是A的邻居。
不要检查所有4个或8个方向,只需检查其中的一半,例如只有北部,东北部,东部和东南部,并且当您同时找到(A,B)和(B,A)配对时。