Сито Эратосфена в две строки.
primes = set(range(2,1000000))
for n in [2]+range(3,1000000/2,2): primes -= set(range(2*n,1000000,n))
Редактировать: я понял, что вышеупомянутое не является истинным ситом Эратосфена, потому что оно фильтрует на множестве нечетныхчисла, а не набор простых чисел, что делает его излишне медленным.Я исправил это в следующей версии, а также включил ряд общих оптимизаций, как указано в комментариях.
primes = set([2] + range(3, 1000000, 2))
for n in range(3, int(1000000**0.5)+1, 2): primes -= set(range(n*n,1000000,2*n) if n in primes else [])
Первая версия все еще короче и дает правильный результат, даже если оназанимает больше времени.