繁体   English   中英

python中的内存使用情况

[英]Memory usage in python

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

如果您在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)

如果您提供脚本,那么有人可以告诉您可以在哪些地方使用内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM