【问题标题】:How can I make Python work faster? [duplicate]如何让 Python 运行得更快? [复制]
【发布时间】:2013-03-14 00:29:30
【问题描述】:

我正在尝试计算 200 万以下的所有质数的总和,由于我已经编写了一个函数来查找小于给定数字的质数,所以我只是编写了一个新函数来调用旧函数并将该列表中的项目相加。

但它似乎需要永远。我怎样才能加快这段代码的速度?

def find_primes(n):
    "Find the prime numbers below n"
    primes=[];
    for i in range(2,n):
        for fac in range (2,i):
            if i!=fac and i%fac == 0:
                break
        else:
            primes.append(i)
    return primes

def add_primes(m):
    "Sum all the prime numbers below m"
    newlist=find_primes(m);
    t=sum(newlist);
    return t

PS:我是一个 Python 新手,所以如果你能很好地解释我的错误,我会很高兴。提前致谢。

【问题讨论】:

  • 让您的代码更智能地工作?
  • 顺便说一句,条件i != fac 总是为真,因为range 不会产生“停止”参数,因此每个循环都在进行无用的比较(即使它应该很快)。

标签: python


【解决方案1】:

实现Sieve of Eratosthenes。这将使您的代码比目前做的工作少很多,速度也快很多。

【讨论】:

  • 非常感谢,我想不出在我的代码中使用那个。我马上试试。
【解决方案2】:

您可以通过将 for fac in range (2,i) 行替换为以下代码来改进当前代码:

for fac in primes:

代码:

def find_primes1(n):
    "Find the prime numbers below n"
    primes=[2,3]     #initialize primes with 2 values
    for i in range(4,n):
        for fac in primes:
            if i!=fac and i%fac == 0:
                break
        else:
            primes.append(i)
    return primes

时间比较:

In [6]: %timeit find_primes(10**4)   # your version
1 loops, best of 3: 2.33 s per loop

In [7]: %timeit find_primes1(10**4)
1 loops, best of 3: 171 ms per loop

In [8]: find_primes1(10**3)==find_primes(10**3)
Out[8]: True

但对于较大的值,您绝对应该学习Sieve of Eratosthenes 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 2021-05-11
    • 2017-07-11
    • 2021-11-03
    • 1970-01-01
    • 2010-11-06
    • 2023-03-26
    相关资源
    最近更新 更多