完成后,Python程序不会退出

Dan*_*Dan 6 python linux memory-leaks

我有以下脚本186.py:

S=[]
study=set([524287])

tmax=10**7
D={}
DF={}
dudcount=0
callcount=0

def matchval(t1,t2):
    if t1==t2:
        global dudcount
        dudcount+=1
    else:
        global callcount
        callcount+=1
        D.setdefault(t1,set([]))
        D.setdefault(t2,set([]))
        D[t1].add(t2)
        if t1 in D[t2]:
            DF.setdefault(t1,set([]))
            DF[t1].add(t2)
            DF.setdefault(t2,set([]))
            DF[t2].add(t1)

for k in xrange(27):
    t1=(100003 - 200003*(2*k+1) + 300007*(2*k+1)**3)%(1000000)
    S.append(t1)
    t2=(100003 - 200003*(2*k+2) + 300007*(2*k+2)**3)%(1000000)
    S.append(t2)
    matchval(t1,t2)

t1=(100003 - 200003*(55) + 300007*(55)**3)%(1000000)
S.append(t1)
t2=(S[31]+S.pop(0))%(1000000)
S.append(t2)
matchval(t1,t2)

for k in xrange(29,tmax+1):
    t1=(S[31]+S.pop(0))%(1000000)
    S.append(t1)

    t2=(S[31]+S.pop(0))%(1000000)
    S.append(t2)
    matchval(t1,t2)

D.setdefault(524287,set([]))
DF.setdefault(524287,set([]))
print D[524287]
print DF[524287]
print dudcount,callcount
print "Done"
Run Code Online (Sandbox Code Playgroud)

最后一行打印"完成",但发生这种情况时python不会退出.我输入以下命令:

$ time python 186.py
Run Code Online (Sandbox Code Playgroud)

得到结果:

set([810528L, 582178L, 49419L, 214483L, 974071L, 651738L, 199163L, 193791L])
set([])
11 9999989
Done
Run Code Online (Sandbox Code Playgroud)

但我必须按ctrl + C来获取时间:

real    34m18.642s
user    2m26.465s
sys     0m11.645s
Run Code Online (Sandbox Code Playgroud)

在程序输出"Done"之后,python的CPU使用率非常低......但是内存使用量继续增长...一旦达到80%的系统内存(它是一个旧系统),我使用了ctrl + C.

这里发生了什么?打印完成后程序正在做什么?不应该这样做吗?

谢谢,丹

Jus*_*eel 7

我在配备2GB RAM的2 GHz双核笔记本电脑上运行相同的代码,在Cygwin中花了大约1 1/2分钟.程序退出之前内存使用量超过600 MB,Done出现提示后出现并释放内存大约需要2-4秒.但是,我没有看到任何内存增加后Done出现.

我的猜测是它与内存管理有关.在Done看起来之后,Python正在努力释放所有内存,这可能需要一段时间才能在RAM较少的旧机器上运行.我不确定为什么内存实际上会增加,除非只是告诉你使用了多少内存的延迟.