我正在使用 Python 3 制作康威生命游戏,有个名为 updateboard
的函数,可以根据邻居数量(0 到 8)决定细胞的死亡和出生,这些邻居数量存储在 self.neighbors
中。函数如下:
def updateboard(self):
"""
Updates the board state
"""
alive = np.zeros((self.cellsize, self.cellsize), dtype=np.bool) # board state for next loop
# iterate cells
for y in range(self.cellsize):
for x in range(self.cellsize):
if self.neighbors[x, y] > 0: # only look at cells with more than 1 neighbors
if self.board[x, y]: # cell is currently alive
alive[x, y] = True if self.neighbors[x, y] in (2, 3) else False
else: # cell is currently dead
alive[x, y] = True if self.neighbors[x, y] == 3 else False
# update states
self.updateneighbors(self.board, alive)
self.board = alive
为了避免冗余的检查,我会先检查该单元格中的
self.neighbors
是否大于0,然后再确定该单元格是生还是死。我尝试了不同的优化方法,发现将
if self.neighbors[x, y] > 0
更改为if self.neighbors[x, y]
可以显著加快函数运行速度。运行Python分析器显示,这一个改变让函数的运行时间几乎提升了6倍。 之前的代码:
ncalls tottime percall cumtime percall filename:lineno(function)
459 12.465 0.027 13.916 0.030 logic.py:55(updateboard)
之后
ncalls tottime percall cumtime percall filename:lineno(function)
460 1.619 0.004 3.067 0.007 logic.py:55(updateboard)
我试图在网上寻找解释,并发现了许多类似的问题,但尚未找到针对这个具体问题的答案。 我既感到困惑又感到惊讶,因为这一个小小的改变竟然造成了如此大的差异,如果有人能帮助我解释一下,我将非常感激。
if x:
比if x>0:
更快。”始终提出最小可能的问题 - 较小的问题更容易理解和回答。 - DYZ