【问题标题】:Finding the 10001st prime number (in python)? [duplicate]找到第 10001 个素数(在 python 中)? [复制]
【发布时间】:2016-09-15 16:52:42
【问题描述】:

我目前正在尝试使用 Erathonese 筛选器的实现,但仍然需要很长时间才能找到一长串素数。

def sieve(n=1000000):
    not_prime = []
    prime = []
    for i in range(2, n+1): 
        if i not in not_prime:
            prime.append(i) 
            for j in range(i*i, n+1, i): 
                not_prime.append(j) 
    return prime[10002]

我尝试硬编码筛子应该运行到的值,希望它足够长,以便我可以找到第 10002 个元素。运行时间目前是一个大问题,因此任何关于减少运行时间或任何其他方面的提示或建议都值得赞赏。

【问题讨论】:

    标签: python optimization primes mathematical-optimization sieve-of-eratosthenes


    【解决方案1】:

    如果您有兴趣特别改进此代码,那么您可以做的第一件事是使用set 来存储非素数。

    def sieve_set(n=1000000):
        not_prime = set()
        primes = []
        for i in range(2, n+1): 
            if i not in not_prime:
                primes.append(i) 
                for j in range(i*i, n+1, i): 
                    not_prime.add(j)
    
        return primes
    

    这可以防止列表中的数字重复,并使列表中的搜索速度更快。这将大大缩短您的运行时间。

    In [1]: %timeit -n 1 -r 1 sieve(10000)
    1 loops, best of 1: 775 ms per loop
    
    In [2]: %timeit -n 1 -r 1 sieve_set(10000)
    1 loops, best of 1: 5.85 ms per loop
    

    现在找到 10,001 个素数是可以实现的:

    In [3]: %timeit sieve_set(105000)
    10 loops, best of 3: 26.6 ms per loop
    
    In [4]: sieve_set(105000)[10000]
    Out[4]: 104743
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-29
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多