對於一個小型比賽,我需要用Python解決一個問題。但是,該解決方案不得使用超過20MB的內存。python中的內存使用情況
我努力想出一個好的解決方案。當我提交它時,它在前4個例子中工作正常,但沒有通過第5個例子。原因:我的腳本使用的內存超過允許的數量。
我不知道如何做得更好,並且一般如何在Python中查看我的內存使用情況。所以,如果你能給我一種計算內存使用情況的方法,或者有關應該避免節省內存的提示,那就太好了! PS:我正在使用Spyder 3.0.2。我的腳本已經使用了最少量的數組並儘可能縮小它們。
編輯:感謝您的所有答案,這是我的代碼,如果你有想法
"""
Small description of the problem
You are a taxi
You need to satisfy request
A request is a person asking you to take him from pos1 to pos2
There are gas station on the map, you start at the first one
The goal is to satisfy every request while minimizing the amount of gas used BETWEEN two stations
This is a quite non-intuitive problem, we dont care about the total amount of gas
We care about the gas used between two stations
In this problem, the gas used is the distance squared
Example: 2 stations, one request
Stations [0,0] , [2,2]
Request [3,3] =>[2,1]
Solution: You start at [0,0]
[0,0] => [2,2] => [3,3] => [2,2] => [2,1] => [2,2] => [0,0]
Station=>Station=> start =>Station=> end =>Station=>Station
D: sqrt(8) sqrt(2) sqrt(2) 1 1 sqrt(8)
gas: 8 (2*sqrt(2))**2 (2*1)**2 8
"""
def D(pos1, pos2):
# Returns the distance between two positions pos[x,y]
return ((pos1[0]-pos2[0])**2 + (pos1[1]-pos2[1])**2)**0.5
def SPP(pos, stations):
# Returns the closest station to a certain point
indice = 0
mini = D(pos, stations[0])
for i in range(1, len(stations)):
if D(pos, stations[i]) < mini:
mini = D(pos, stations[i])
indice = i
return indice
def SAcc(w, maxi, stations):
# Returns the list of accessible stations given a specific way
last = w[-1]
liste = [x for x in range(len(stations)) if x not in w] # Pas visitées
listem= []
for i in range(len(liste)):
if D(stations[last] , stations[liste[i]]) < maxi: # Si proche
listem.append(liste[i])
return listem
def Dmaxw(w, stations):
# Returns the maximum distance between two stations of a given way
return max([ D(stations[w[i-1]], stations[w[i]]) for i in range(1,len(w)) ])
def OptiDeplS(a, b, stations):
# Optimize the movement from a station a to a station b, returns the minimal distance of the optimized way
optw = [a,b]
ways = [[a]]
maxi = D(stations[a], stations[b])
while ways != []:
nways = []
for w in ways:
for i in SAcc(w, maxi, stations):
nways.append(w + [i])
ways = []
for w in nways:
if w[-1] == b:
if Dmaxw(w, stations) < maxi:
maxi = Dmaxw(w, stations)
optw = w
elif Dmaxw(w, stations) < maxi:
ways.append(w)
return Dmaxw(optw, stations)
def main(n, m, stations, request):
Dmax = 0
SPPr = [ [SPP(r[0],stations),SPP(r[1],stations)] for r in request ]
pos = 0
for i in range(m):
Dmax = max(Dmax, OptiDeplS(pos, SPPr[i][0], stations))
Dmax = max(Dmax, 2*D(stations[SPPr[i][0]], requetes[i][0]))
Dmax = max(Dmax, OptiDeplS(SPPr[i][0], SPPr[i][1], stations))
Dmax = max(Dmax, 2*D(stations[SPPr[i][1]], requetes[i][1]))
pos = SPPr[i][1]
Dmax = max(Dmax, OptiDeplS(SPPr[-1][0], pos, stations))
return round(Dmax**2)
n = 9 # nb of stations
m = 5 # nb of request
stations = [ [1,7],[7,6],[4,1],[2,2],[1,0],[0,3],[2,4],[9,1],[5,5] ]
request = [ [[4,8],[9,7]],[[8,8],[1,6]],[[9,5],[1,4]],[[0,0],[3,5]],[[6,4],[10,0]] ]
print(main(n, m, stations, request))
這非常含糊。如果您發佈腳本,人們可能會告訴您哪些部件的內存效率低下。 –
'psutil'模塊可以提供有關進程的所有信息,包括當前的進程。 –
Python是比賽中唯一允許使用的語言,還是C允許的語言? –