python

时间:2016-12-25 17:52:15

标签: python memory

对于小型比赛,我需要用Python解决问题。但是,解决方案不得使用超过 20MB的内存

我努力想出一个好的解决方案。当我提交它时,它与前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) )

1 个答案:

答案 0 :(得分:0)

如果你在Windows上,你可以看到python进程的内存使用情况

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)

如果你提供脚本,有人可以告诉你哪些内存使用可以改进。