Управление памятью больших списков в Python - PullRequest
3 голосов
/ 30 мая 2011

Сегодня я написал программу, использующую массив / список с 64000000 записей. Тем не менее, при написании sigma=[1]*64000000 с использованием Python он работает нормально, но позже, когда программа вычисляет, моя Ubuntu зависает - без какой-либо реакции на ввод, даже движения мыши. Я пытался дважды, и результаты совпадают.

При реализации в C ++ long long sigma[64000000] прекрасно работает и работает очень быстро.

Есть ли какая-либо причина, по которой моя программа зависла бы в середине работы, кроме сбоев в начале?

РЕДАКТИРОВАТЬ: Чтобы ответить Крису ниже, мой код не зависает до тех пор, пока через пару циклов.

Спасибо всем!

Для тех, кто заинтересован в просмотре кода, это программа, грубая сила Project Euler 211:

def e211():
ans=0
sigma=[1]*64000000
for i in range(2,64000000):
    j=i;
    if ((j%1000==0) or (j<100)):
        print(j)
    q=i*i
    while j<64000000:
        sigma[j]+=q
        j+=i
for i in range(1,64000000):
    j=int(sqrt(sigma[i]))
    if j*j==sigma[i]:
        ans+=i
if __name__=='__main__':
    print(e211())

Ответы [ 2 ]

7 голосов
/ 30 мая 2011

Списки Python - это списки объектов .Число в Python само по себе является объектом и занимает несколько больше места, чем 64 бита, необходимых для представления long long в C ++.В частности, Python прозрачно обрабатывает числа больше 32 бит, что в итоге занимает лот больше места, чем простое целое число.

Вы можете найти стандартный Python array модуль полезен.Он обеспечивает Python-совместимый доступ к унифицированным массивам целых чисел указанного размера.(Однако я отмечаю, что он не предлагает 64-битный целочисленный тип.)

2 голосов
/ 30 мая 2011
range(1,64000000):

Эта строка создает полный список размером 64000000, так что теперь у вас есть два списка такого размера в памяти. Вместо этого используйте xrange.

...