【发布时间】:2019-12-10 01:36:46
【问题描述】:
我使用“埃拉托色尼筛法”来产生素数。
def primes(n):
if n < 2:
return None
primes_sieve = [True] * (n + 1)
primes_sieve[1] = False
primes_sieve[0] = False
# sieve
for i in range(2, int(n ** 0.5) + 1):
if primes_sieve[i]:
for j in range(i * i, n + 1, i):
primes_sieve[j] = False
return [i for i, p in enumerate(primes_sieve) if p]
它适用于小数字。
In [28]: primes(2**10)[:10]
Out[28]: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
In [29]: primes(2**10)[-10:]
Out[29]: [967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021]
In [30]: primes(2**15)[-10:]
Out[30]: [32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, 32749]
对于一些大的数字,任意报错。
内存错误
In [32]: primes(2**30)[-10:]
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-32-3e546166a3d9> in <module>
----> 1 primes(2**30)[-10:]
<ipython-input-26-5f07bf9cb49e> in primes(n)
2 if n < 2:
3 return None
----> 4 primes_sieve = [True] * (n + 1)
5 primes_sieve[1] = False
6 primes_sieve[0] = False
MemoryError:
和溢出错误:
In [35]: primes(2**100)[-10:]
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-35-3bb8857d5f28> in <module>
----> 1 primes(2**100)[-10:]
<ipython-input-26-5f07bf9cb49e> in primes(n)
2 if n < 2:
3 return None
----> 4 primes_sieve = [True] * (n + 1)
5 primes_sieve[1] = False
6 primes_sieve[0] = False
OverflowError: cannot fit 'int' into an index-sized integer
有什么问题?我很高兴也很好奇地发现python也有OverflowError。
【问题讨论】:
标签: python python-3.x allocation