对于一个小型比赛,我需要用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允许的语言? –