Программа Python не завершается после завершения - PullRequest
6 голосов
/ 10 марта 2010

У меня есть следующий скрипт 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 очень мала ... но использование памяти продолжает расти ... Я использовал ctrl + C, как только он достиг 80% моей системной памяти (старая система) .

Что здесь происходит? Что делает программа после печати Done? Разве это не должно быть сделано?

Спасибо, Dan

Ответы [ 2 ]

7 голосов
/ 10 марта 2010

Я запустил тот же код на моем двухъядерном ноутбуке с частотой 2 ГГц и 2 ГБ ОЗУ, а в Cygwin это заняло около 1 1/2 минуты. Использование памяти возросло более чем на 600 МБ до завершения работы программы, и потребовалось около 2-4 секунд после появления Done для появления приглашения и освобождения памяти. Однако после появления Done я не заметил увеличения памяти.

Полагаю, это связано с управлением памятью. После появления Done Python работает над освобождением всей памяти, что может занять довольно много времени на старой машине с меньшим объемом оперативной памяти. Я не уверен, почему на самом деле увеличивается объем памяти, если только то, что говорит вам о том, сколько памяти используется, просто задерживается.

0 голосов
/ 10 марта 2010

В ваших публикациях нет указаний, соответствующих описанным симптомам. Возможно, отступ в исполняемом коде заполнен, и вы действительно собираетесь запустить еще один цикл вокруг всей кучи. Обратите внимание, что только смелые люди будут пытаться воспроизвести вашу проблему, если для ее запуска требуется 34 минуты. Можете ли вы воспроизвести эту проблему в более короткие сроки?

Когда вы сделали Control-C, что сказал трассировка?

В любом случае, я бы настоятельно рекомендовал не иметь жестко закодированных констант (?) Повсюду, например 524287 .... дайте ему осмысленное имя и сделайте meaningful_name = 524287 в начале. Или, если это действительно переменная, введите ее через sys.argv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...