Python程序完成后不退出

6 投票
2 回答
1968 浏览
提问于 2025-04-15 20:13

我有一个脚本叫做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"

最后一行打印了“完成”,但是当这发生时,python并没有退出。我输入了以下命令:

$ time python 186.py

然后得到了这些结果:

set([810528L, 582178L, 49419L, 214483L, 974071L, 651738L, 199163L, 193791L])
set([])
11 9999989
Done

但是我必须按ctrl+C才能获取时间:

real    34m18.642s
user    2m26.465s
sys     0m11.645s

在程序输出“完成”后,python的CPU使用率很低……但是内存使用量却持续增长……我在内存使用达到我系统的80%时按了ctrl+C(因为我的系统比较旧)。

这到底是怎么回事?在打印“完成”之后,程序在做什么?难道不应该结束了吗?

谢谢,

2 个回答

0

你发的内容里没有任何信息能和你描述的问题对应上。也许你执行的代码缩进有问题,实际上你可能是在重复执行一个循环。要知道,只有勇敢的人才会愿意花34分钟来尝试复现你的问题。你能在更短的时间内复现这个问题吗?

当你按下Control-C时,错误信息显示了什么?

无论如何,我强烈建议不要到处使用硬编码的常量,比如524287……给它起个有意义的名字,然后在开头写成meaningful_name = 524287。或者如果它真的是一个变量,可以通过sys.argv.来传入。

7

我在一台2 GHz双核的笔记本电脑上运行了相同的代码,这台电脑有2GB的内存,结果在Cygwin环境下大约花了1分半钟。程序运行时,内存使用量超过了600MB,程序结束后,显示Done后大约过了2到4秒才出现提示符,内存才释放。不过,我注意到在Done出现后,内存使用量并没有再增加。

我猜这可能和内存管理有关。在Done出现后,Python正在努力释放所有的内存,而在老旧的机器上,内存较少,这个过程可能会花费比较长的时间。我不太明白为什么内存会实际增加,除非是显示内存使用情况的那个东西有延迟。

撰写回答