remove () не является медленным в общей схеме вещей, просто код называет это LOT.
Как советует dappawit, вместо изменения списка измените значение в списке так,вы знаете, что это недопустимое число для использования.
Я также вижу, что при генерации набора простых чисел вы используете range(2,maxrange)
, что нормально, но неэффективно, если нижняя граница слишком великабольше 2. Вы будете тратить вычислительное время на генерацию простых чисел, которые даже не имеют отношения к проблемному пространству.Если ничего другого, следите за minrange, а также maxrange.
Ошибка с вашим исходным кодом в том, что вы используете range(2,maxrange)
.Это означает, что maxrange
нет в списке рассматриваемых чисел.Попробуйте 3 5
в качестве ввода для a и b, чтобы увидеть ошибку.
range(2,maxrange+1)
исправляет проблему.
Другая ошибка в коде заключается в том, что вы изменяете исходную последовательность:
From Python docs - for-Statement
Не безопасно изменять итерируемую последовательность в цикле (это может произойти только для изменяемых типов последовательностей, таких каккак списки).Если вам нужно изменить список, который вы перебираете (например, для дублирования выбранных элементов), вы должны перебрать копию.Обозначение среза делает это особенно удобным:
Мои навыки Python рудиментарны, но это работает:
Старый:
primes2 = range(2,maxrange)
for i in primes:
for j in primes2:
if(j != i and j%i == 0):
primes2.remove(j)
for (a,b) in indices:
for p in primes2:
if(a<= p and b >= p):
Новый:
primes2 = array.array('L', range(minrange,maxrange+1))
for i in primes:
for j in primes2:
if(j != i and j%i == 0):
primes2[j-minrange] = 0
for (a,b) in indices:
for p in primes2:
if (p != 0):
if(a<= p and b >= p):
Вы также можете пропустить генерацию набора простых чисел и просто проверить числа напрямую, что сработает, если наборы чисел, которые вы должны сгенерировать, не перекрываются (без дублирования работы). введите описание ссылки здесь