python中的内存使用

2024-10-02 20:42:03 发布

您现在位置: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) )

Tags: ofthetoinposforreturnrequest
1条回答
网友
1楼 · 发布于 2024-10-02 20:42:03

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

如果你提供你的脚本有人可以告诉你哪里可以提高内存使用率。你知道吗

相关问题 更多 >