Я написал генератор простых чисел, используя Сито Эратосфена и Python 3.1. Код работает корректно и грациозно на 0,32 секунды на ideone.com для генерации простых чисел до 1 000 000.
# from bitstring import BitString
def prime_numbers(limit=1000000):
'''Prime number generator. Yields the series
2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ...
using Sieve of Eratosthenes.
'''
yield 2
sub_limit = int(limit**0.5)
flags = [False, False] + [True] * (limit - 2)
# flags = BitString(limit)
# Step through all the odd numbers
for i in range(3, limit, 2):
if flags[i] is False:
# if flags[i] is True:
continue
yield i
# Exclude further multiples of the current prime number
if i <= sub_limit:
for j in range(i*3, limit, i<<1):
flags[j] = False
# flags[j] = True
Проблема заключается в том, что у меня заканчивается память, когда я пытаюсь создать числа до 1 000 000 000.
flags = [False, False] + [True] * (limit - 2)
MemoryError
Как вы можете себе представить, выделение 1 миллиарда булевых значений ( 1 байт 4 или 8 байтов (см. комментарий) каждый в Python) действительно невозможно, поэтому я просмотрел bitstring. Я полагал, что использование 1 бит для каждого флага будет намного более эффективным для памяти. Однако производительность программы резко снизилась - 24 секунды в режиме ожидания, для простого номера до 1 000 000. Вероятно, это связано с внутренней реализацией bitstring.
Вы можете комментировать/раскомментировать три строки, чтобы увидеть, что я изменил, чтобы использовать BitString в качестве фрагмента кода выше.
Мой вопрос: есть способ ускорить мою программу, с или без bitstring?
Изменить: проверьте исходный код перед отправкой. Я не могу принимать ответы, которые работают медленнее, чем мой существующий код, естественно.
Изменить еще раз: