【问题标题】:finding the sum of all the primes below two million my code is slow [duplicate]找到低于 200 万的所有素数的总和我的代码很慢 [重复]
【发布时间】:2020-11-27 14:45:23
【问题描述】:

我是 python 的初学者,我的代码花了很多时间才找到低于 200 万的素数,他可以很好地处理像数千这样的数字,但一百万是一个很大的数字,任何人都知道我能做什么谢谢提前:

arr = list()
for i in range(2, 200000):
    for j in range(2, i + 1):
        if i % j == 0 and i == j:
            arr.append(i)
        elif i % j == 0 and i != j:
            break
        else:
            continue
print(arr)

【问题讨论】:

标签: python python-3.x


【解决方案1】:

首先,您可以使用一些逻辑来改进您的列表。排除第二个并跳过每个偶数:

for i in range(3, 200000, 2):

在第二个循环中也可以这样做

您还可以排除已找到的素数的所有平方等

【讨论】:

  • 感谢兄弟,他现在花的时间更少了
【解决方案2】:

开发更高效算法的第一步是尝试埃拉托色尼筛法 (https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes):

limit = 200000
arr = list(range(limit))
# The algorithm starts at 2
for num in arr[2:]:
    if arr[num]:
        idx = 2 * num
        while idx < limit:
            arr[idx] = 0
            idx += num

primes = [elem for elem in arr if elem > 1]

【讨论】:

  • 感谢您指出这一点。我现在已经编辑了我的答案。
  • 你不能使用arr 的切片(它复制arr)而不不必要地筛选一大堆素数。您想要if num:,但您需要将for num in arr[2:]: 切换为for num in itertools.islice(arr, 2, None): 之类的东西,这样它才能看到您筛选过的list 的实时视图,并且if num: 可以在number 是已知的非素数。
  • @ShadowRanger 或者他们可以切换到if arr[num]:
  • @ShadowRanger 这很有帮助,谢谢!这基本上是我最初想做的事情,但我并没有完全做到。我(再次)编辑了我的答案以反映来自超级雨的建议,因为这更接近我最初尝试做的事情。
  • @nenb 谢谢你的帮助
猜你喜欢
  • 2018-03-14
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多