Python实现数据量较大的生命游戏

发布于 2022-09-11 15:14:43 字数 1789 浏览 26 评论 0

我现在要用串行的方法实现一个生命游戏,这个生命游戏是在一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

谜泪 2022-09-18 15:14:43

是不是中间结果占用内存太多了,可以把之前繁衍的那些代回收了.

放飞的风筝 2022-09-18 15:14:43
In [1]: import sys

In [2]: a = [0] * 100000

In [3]: len(a)
Out[3]: 100000

In [4]: sys.getsizeof(a)
Out[4]: 400036

In [5]: b = "0"*100000

In [6]: len(b)
Out[6]: 100000

In [7]: sys.getsizeof(b)
Out[7]: 100021

算是提供一个思路吧

迷你仙 2022-09-18 15:14:43

你算过内存需求量没?
list里一个元素占4字节,所以:
100000**2 * 4 / 1024**3 = 37G
两个数组就是 74G !
再算上其他的消耗,至少要80G内存。
可以考虑的办法:
改用bitarraybitarray,这样每个元素占1bit,内存大概降为1.5G
改善算法,去掉临时数组Temp

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文