Python程序结束后没有退出

6

我有以下脚本 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"

最后一行输出“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个回答

7
我在我的2GHz双核笔记本电脑上运行了相同的代码,内存为2GB,在Cygwin中大约需要1分30秒。程序退出时,内存使用量超过了600MB,并且在 Done 出现后需要2-4秒才能出现提示并释放内存。但是,我没有看到 Done 后内存增加的情况。
我猜测这与内存管理有关。在 Done 出现后,Python正在努力释放所有内存,这可能需要在内存较少的旧机器上花费相当长的时间。我不确定内存实际上为什么会增加,除非是因为告诉你正在使用多少内存的东西有延迟。

我只有480 MB的RAM和1.4 GB的SWAP。清理内存的时间比运行程序的时间长10倍,这似乎很奇怪。我是否因为在交换内存(而你可能没有)的原因导致释放内存的过程比程序本身还要耗时? - Dan
进行一些进一步的测试...这个问题只会在发生交换时出现。我开始认为这不是一个代码/Python问题,而是一个硬盘写入速度或其他系统问题...所以可能不再是一个编程问题。感谢您的帮助。 - Dan

0

从您发布的内容中没有任何迹象与所描述的症状相符。也许执行代码时缩进有误,您可能真的要在整个堆栈周围运行另一个循环。请注意,只有勇敢的人才会尝试复制您的问题,当它需要34分钟运行时。您能否在更短的时间内重现此问题?

当您执行Control-C时,回溯信息是什么?

无论如何,我强烈建议不要在各个地方都硬编码常量,例如524287……给它起一个有意义的名称,并在开头输入meaningful_name = 524287。或者如果它是一个变量,通过sys.argv进行输入。


该程序不需要34分钟才能运行完毕。它只需要约2分钟就可以运行完毕,但是却无法退出。我让它继续运行了32分钟后才决定结束它。当我降低tmax的值时,它运行得更快,并且没有出现同样的问题。 - Dan
哦,原来是交换操作,你(a)没有注意到(b)注意到了但认为不值得一提? - John Machin
这是(a)。我仍然不完全理解交换如何解释这种奇怪的行为...交换清除应该比交换写入更快,不是吗?交换清除怎么可能比原始程序慢一个数量级? - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接