【问题标题】:How to fasten algorithm to calculate Prime Numbers in Python [duplicate]如何在Python中加快算法计算素数[重复]
【发布时间】:2018-07-08 05:26:36
【问题描述】:

这是我的代码:

import math

n=100

prime=[]
[prime.append(i) for i in range(2,n)]
i=2

"""for i in range(2,int(math.sqrt(n))):"""
while i*i <= n:
    for j in range(2,n+1):
        if i * j in prime:
            prime.remove(i*j)
    i +=1

print(prime)

现在这可行,但是当我将 n 从 100 更改为 10000 时,它会崩溃。我该如何固定它或者我应该使用发电机方式?谢谢。

【问题讨论】:

  • 对于初学者,[prime.append(i) for i in range(2,n)] 列出了一个完全无用的 [None, None,...] 列表
  • prime 变成set,这样可以加快速度。
  • 或使用 Sieve of Erathostenes 算法。更快。
  • 我尝试实现 Sieve of Eratosthenes 算法,但方式不同。我想我不能:)。我找到了一些更快的算法,但我想学习如何才能。谢谢大家。

标签: python python-3.x algorithm primes sieve-of-eratosthenes


【解决方案1】:

我用过:

def gen_primes():
    D = {}

    q = 2

    while True:
        if q not in D:
            yield q
            D[q * q] = [q]
        else:
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]

        q += 1

从这里的一篇旧帖子中得到它...我会寻找它并在我找到它时将其归功于它,

【讨论】:

【解决方案2】:

我们可以只用一个循环来做到这一点:

num = 407
if num > 1:
   for i in range(2,num):
       if (num % i) == 0:
           print(num,"is not a prime number")
           print(i,"times",num//i,"is",num)
           break
   else:
       print(num,"is a prime number")
else:
   print(num,"is not a prime number")

【讨论】:

    【解决方案3】:

    时间爆炸的原因是你使用的数据结构使得这是一个O(n^2)的算法。

    使用set 将允许等效逻辑,同时将其简化为 O(n) 算法:

    import math
    
    n=100
    
    prime = set(i for i in range(2,n))
    i=2
    
    while i*i <= n:
        for j in range(2,n+1):
            if i * j in prime:
                prime.remove(i*j)
        i +=1
    
    print(prime)
    

    特别昂贵的操作是i * j in prime。如果prime 是一个列表,它可能必须扫描整个列表。对于一个集合,它不必扫描所有元素。

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2013-02-13
      • 2014-03-26
      • 2010-09-16
      • 2011-04-13
      • 2016-08-05
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      相关资源
      最近更新 更多