2016-12-25 70 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