簡體   English   中英

Python 內存 - Python 代碼超出了內存限制

[英]Python memory - The memory limit exceeded for Python code

我在解決自穿越問題時遇到了這個問題。 這就像蛇游戲。

給定 x = [2, 1, 1, 2],我們從 0 開始,然后向上走 2 次,向左走 1 次,向右走 1 次,向下走 2 次。目標是計算它是否會自交叉與否。 由於給定的步驟總是整數,我考慮使用矩陣,每次當它通過一個點時,我將點設置為 1。這樣我可以檢查該點是否已被訪問。

我認為這樣一來,Python 會做的所有內存都只是矩陣的賦值。 這就是為什么我不明白什么時候輸入 x 很大,以及為什么它說"memory out of limit" 對我來說,我認為記憶與之前啟動的矩陣相同。

我怎樣才能解決這個問題?

class Solution(object):

    def isSelfCrossing(self, x):
        """
        :type x: List[int]
        :rtype: bool
        """
        m = [[0 for j in xrange(1000)] for j in xrange(1000)]
        m[0][0] = 1
        a, b = 0, 0
        flag = 0
        for i in x:
            flag = (flag + 1) % 4
            if flag == 1:
                for temp in xrange(1, i+1):
                    b += 1
                    if m[a][b] != 0:
                        return True
                    else: m[a][b] = 1
            elif flag == 2:
                for temp in xrange(1, i+1):
                    a -= 1
                    if m[a][b] != 0:
                        return True
                    else: m[a][b] = 1
            elif flag == 3:
                for temp in xrange(1, i+1):
                    b -= 1
                    if m[a][b] != 0:
                        return True
                    else: m[a][b] = 1
            else:
                for temp in xrange(1, i+1):
                    a += 1
                    if m[a][b] != 0:
                        return True
                    else: m[a][b] = 1
        return False

“x”可以有多大? 如果“x”不是那么大,你的代碼運行成功了嗎?

假設“x”真的很大,它可能與你的“m”初始化有關,這是壓倒駱駝的稻草 換句話說,您的“x”(以及其他一些內存分配)可能消耗了進程允許的幾乎所有內存分配,並且“m”初始化超過了限制。

在 Python 中為布爾矩陣使用列表很少有意義。 嘗試將整數對存儲在一個set並替換

m = ...       # with m = set()
m[a][b] != 0  # with (a, b) in m
m[a][b] = 1   # with m.add((a, b))

或者,您可以創建一個元素數與m相同的平面bytearray ,並將其索引a * 1000 + b 然而,這可能會導致微妙的索引錯誤,所以我強烈建議先嘗試set

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM