2012-06-29 2 views
2

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

maxlen = 1024 
for i in range(1023, -1, -1): 
    maxlen -= 1 
    number = "" 
    for k in range(maxlen, -1, -1): 
      number = pi[k] + number 
      if isprime(number) == True: 
        print number 

isprime() - это функция, которая проверяет, является ли число простым (довольно стандартным). это работает довольно хорошо до определенного момента, когда я получаю MemoryError.

Это не потому, что число, проверенное функцией, слишком велико, так как оно происходит вокруг шестого пробега первого цикла.

Я уже пробовал gc.enable() и gc.collect() без какого-либо положительного результата.

У кого-нибудь есть идея, как это исправить?

Edit: определение пи и IsPrime() согласно запросу:

f = open("/root/number", "r") 
pi = f.read() 
f.close() 

где файл «номер» содержит оригинальный номер, в котором я хотел бы найти простое число.

def isprime(n): 
    n = abs(int(n)) 
    if n < 2: 
      return False 
    if n == 2: 
      return True 
    if not n & 1: 
      return False 
    for x in range(3, int(n**0.5)+1, 2): 
      if n % x == 0: 
        return False 
    return True 

Traceback:

Traceback (most recent call last): 
    File "./primal.py", line 36, in <module> 
    if isprime(number) == True: 
    File "./primal.py", line 24, in isprime 
    for x in range(3, int(n**0.5)+1, 2): 
MemoryError 
+1

Какое определение 'isprime'? –

+2

Также вы могли бы предоставить вывод трассировки? –

+1

Что такое 'pi'? И почему вы просто не используете 'for maxlen в диапазоне (1023, -1, -1):'? – JAB

ответ

6

Использование xrange вместо range, что самое главное в isprime здесь:

for x in xrange(3, int(n**0.5)+1, 2): 

xrange не создает весь список в памяти, в то время как диапазон делает , но вы не используете результаты после того, как вы повторили их.

Еще один совет: просто тест на isprime(n), нет никакой необходимости, чтобы увидеть, если она равна True, то есть то, что ifделает. :-)

if isprime(number): # Only works if isprime(number) is boolean True 
    ... 
+2

Генераторы и ленивая оценка, в общем, отлично подходят для интенсивного использования памяти. – JAB

+0

отличные подсказки, thx. все еще не работает, но я буду продолжать поиск этих ошибок самостоятельно. – fragman

+0

@fragman: не забудьте использовать новый SO-запрос для каждой новой проблемы, с которой вы сталкиваетесь (и искать существующие ответы). –

4

Если это в Python против 2.x использование xrange() вместо range(). range() создает список сразу в памяти, а xrange() работает «по требованию», генерируя значение каждый раз, когда вам это нужно.

В Python 3.xxrange() нет, и range() действует как xrange() раньше.

Цитирую What's New in Python 3:

диапазон() теперь ведет себя как xrange(), используемый для себя, за исключением того, что работает с значений произвольного размера. Последнее больше не существует.

+0

Спасибо за это объяснение. Я все еще использую 2.7, поэтому я изменил его на xrange(), но я буду помнить об этом, когда переключусь на 3.x – fragman

+0

@fragman. Добро пожаловать. Недавно я начал использовать v3 (в дополнение к продолжению использования 2.7) и нашел «What's New .. in 3» интересное/информативное чтение. – Levon

Смежные вопросы