【发布时间】:2017-10-09 22:54:12
【问题描述】:
我正在用 Python 编写一个用于 Eratosthenes 筛子的素数程序。虽然它似乎工作,但它非常缓慢。如何加快速度?
primes = []
upperLimit = 1000
for x in range(2,upperLimit):
primes.append(x)
for y in range(0,int(len(primes)**0.5)):
remove = []
for j in range(primes[y]**2,upperLimit,primes[y]):
remove.append(j)
for i in remove:
if i in primes:
primes.remove(i)
print(primes)
更新: 感谢答案的帮助,我使用布尔值而不是数字重写了代码。低于 100000 的列表现在运行时间不到 6 秒。
i = 2
limit = 100000
primes = [True] * limit
primes[0] = False
while i < limit**0.5:
if primes[i-1]:
for x in range(i * 2, limit + 1,i):
primes[x-1] = False
i += 1
count = 1
total = []
for i in primes:
if i:
total.append(count)
count += 1
print(total)
【问题讨论】:
-
慢有多慢,您使用的是什么系统/Python?您还应该问自己是否创建了太多列表,从而创建了大量不需要创建的内存。
-
罪魁祸首是
primes.remove,这是一个O(N)操作 -
在 20000 的限制下运行大约需要 30 秒,当我尝试超过 1000000 的值时,我在大约 10 分钟后才停止
标签: python algorithm primes sieve-of-eratosthenes