2016-12-25 69 views
0

对于一个小型比赛,我需要用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)) 
+0

这非常含糊。如果您发布脚本,人们可能会告诉您哪些部件的内存效率低下。 –

+0

'psutil'模块可以提供有关进程的所有信息,包括当前的进程。 –

+0

Python是比赛中唯一允许使用的语言,还是C允许的语言? –

回答

0

如果你在Windows上,你可以看到蟒蛇过程

def memory(): 
    import os 
    from wmi import WMI 
    w = WMI('.') 
    result = w.query("SELECT WorkingSet FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=%d" % os.getpid()) 
    return int(result[0].WorkingSet) 
的内存使用情况

如果您提供脚本,有人可以告诉您可以改善内存使用情况。

+0

如果他使用* nix怎么办? – marmeladze

+0

我加了脚本:) – Philippe