Python程序完成后不退出
我有一个脚本叫做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正在努力释放所有的内存,而在老旧的机器上,内存较少,这个过程可能会花费比较长的时间。我不太明白为什么内存会实际增加,除非是显示内存使用情况的那个东西有延迟。