def fast_primes(max_n):
numbers = range(3, max_n+1, 2)
half = (max_n)//2
initial = 4
for step in xrange(3, max_n+1, 2):
for i in xrange(initial, half, step):
numbers[i-1] = 0
initial += 2*(step+1)
if initial > half:
return [2] + filter(None, numbers)
start = 5
tmp = []
while len(tmp) < 10001:
tmp=fast_primes(start)
start <<=1
print tmp[10001]
seems to be pretty fast to me (took 0.02 seconds on my marginal computer)