代码之家  ›  专栏  ›  技术社区  ›  Dan

python程序完成后不退出

  •  6
  • Dan  · 技术社区  · 15 年前

    我有下面的脚本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 回复  |  直到 15 年前
        1
  •  7
  •   Justin Peel    15 年前

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

    我猜这和内存管理有关。之后 多恩 看来,python正在努力释放所有内存,而在内存较少的旧机器上,这可能需要相当长的时间。我不知道为什么记忆会增加,除非有一个延迟告诉你有多少记忆被使用。

        2
  •  0
  •   John Machin Santi    15 年前

    你发布的内容中没有与描述的症状相匹配的迹象。也许执行代码中的缩进被填满了,您真的将围绕整个堆运行另一个循环。请注意,只有勇敢的人才会在需要34分钟才能解决问题时费心去尝试重现问题。你能在短时间内重现这个问题吗?

    当你做control-c的时候,回溯说了什么?

    无论如何,我强烈建议不要使用硬编码常量(?)到处都是,例如524287……给它一个有意义的名字 meaningful_name = 524287 一开始。或者如果它真的是一个变量,通过 sys.argv.