Python实现数据量较大的生命游戏
我现在要用串行的方法实现一个生命游戏,这个生命游戏是在一个100000 x 100000的棋盘上,并且繁衍500代。我选择用list形成一个二维数组来装这个棋盘上的数据,可是程序运行到一半,报错说memory error
,如果数据量小一点的话运行时没问题的。请问我应该怎么改进呢
# 棋盘的行列数
row = 100000
column = 100000
# 进化代数
count = 50
nCellSta = [[random.randint(0, 1) for i in range(column)] for j in range(row)]
nTempSta = [[0 for p in range(column)] for q in range(row)]
def CellCount(nRow, nColumn):
global row, column, nCellSta
nSum = 0
for i in range(nRow - 1, nRow + 2):
for j in range(nColumn - 1, nColumn + 2):
if i < 0 or i > row - 1 or j < 0 or j > column - 1 or i == nRow and j == nColumn:
continue
if nCellSta[i][j] == 1:
nSum += 1
if nSum == 0 or nSum == 1 or nSum == 4 or nSum == 5 or nSum == 6 or nSum == 7 or nSum == 8:
return 0
elif nSum == 2:
return nCellSta[nRow][nColumn]
elif nSum == 3:
return 1
# 输出列表nCellSta的值
def printValue():
nSum = 0
global row, column
for i in range(row):
for j in range(column):
# 打印效果
# print(nCellSta[i][j], ' ', end='')
nSum += nCellSta[i][j]
# print('\n')
return nSum
def main():
global count, nCellSta, nTempSta
printValue()
startTime = time.perf_counter()
for k in range(count - 1):
# print('新一轮游戏:\n')
for i in range(row):
for j in range(column):
nTempSta[i][j] = CellCount(i, j)
nCellSta = copy.deepcopy(nTempSta)
if not printValue():
print('全部死亡,进化结束')
break
endTime = time.perf_counter()
seconds = endTime - startTime
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
print('花费时间为:%d:%02d:%.3f' % (h, m, s))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
是不是中间结果占用内存太多了,可以把之前繁衍的那些代回收了.
算是提供一个思路吧
你算过内存需求量没?
list里一个元素占4字节,所以:
100000**2 * 4 / 1024**3
= 37G两个数组就是 74G !
再算上其他的消耗,至少要80G内存。
可以考虑的办法:
改用
bitarray
bitarray,这样每个元素占1bit,内存大概降为1.5G改善算法,去掉临时数组Temp