Python程序完成后不会退出

标签 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"

最后一行打印“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

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

这是怎么回事?打印完成后程序在做什么?不应该做吗?

谢谢, 丹

最佳答案

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

我猜它与内存管理有关。在 Done 出现后,Python 正在努力释放所有内存,这在 RAM 较少的旧机器上可能需要相当长的时间。我不确定为什么内存实际上会增加,除非只是延迟告诉您正在使用多少内存。

关于Python程序完成后不会退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2412715/

相关文章:

python - 解释对象图编号 : memory leak?

python - Python 字典中的一个值可以有两个值吗?

linux - 在 bash 中使用 bash 循环迭代日期——for (( ... )) 无法正常工作

iOS 内存泄漏,内存图调试器未显示泄漏,但同时 Xcode-Instruments-leaks 显示泄漏

linux - 核心文件不是在 ARM 上的段错误上创建的

linux - 我可以在 awk 中导入/使用 bash 函数吗?

javascript - jQuery/Sizzle checkContext 内存泄漏

Python pysft/paramiko 'EOF during negotiation' 错误

python - 使用 Scrapy 而非 Scraped Items 从表中抓取数据

python - 如何在 get_or_create 中用另一个对象更新对象?