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

Что продолжается здесь? Что делает программа, после того, как Сделано печатается? Разве это не должно быть сделано?

Спасибо, Dan

6
задан Dan 9 March 2010 в 21:29
поделиться

2 ответа

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

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

7
ответ дан 17 December 2019 в 00:07
поделиться

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

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

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

0
ответ дан 17 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: