[英]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.