【问题标题】:how to make this code on python run faster?如何使python上的这段代码运行得更快?
【发布时间】:2015-08-22 09:35:37
【问题描述】:

我在 python 上写了这个 sn-p 来解决项目 Euler 问题 #10,但是我已经等了 15 分钟(运行这段代码),它仍然没有结束。

请帮助我改进或优化此代码。

这里是sn-p:

def prime (n):
  f = 1 #flag
  for i in range(2,n):
    if n % i == 0:
        f = 0
  return f

s = 0 # Sum
for i in range(2,2000000):
if prime(i) == 1:
    s = i  +  s
print s

【问题讨论】:

  • 嗯 - 最简单的事情是 - 你不必一直跑到 n 来找出素数,sqrt(n) 会让它运行得更快。
  • @gabhijit 立即返回会使它更快:)
  • 哦,是的! @alik - 抱歉错过了! :)
  • 另一个简单的事情是直接返回值,而不是继续循环遍历其他所有内容,甚至只是return all(n%i != 0 for i in range(2,n))

标签: python performance helpers


【解决方案1】:
import math

def prime (n):
    for i in xrange(2, int(math.sqrt(n))+1):
        if n % i == 0:
            return False
    return True

s = 2 # Sum
for i in xrange(3,2000000, 2):
    if prime(i):
        s += i
print s

对我来说它运行不到 10 秒。

首先,一旦你发现一个数字是复合的,你想从prime返回。

其次,您不想检查偶数。用xrange(3,2000000, 2)跳过它们

第三,不需要检查prime中从2n的所有数字,因为a*b = b*a

由于您使用 Python 2,我已将 range 替换为 xrange,它会更高效一些。

【讨论】:

    【解决方案2】:

    如果您想要直到 2000000 的所有素数,您应该考虑使用 埃拉托色尼筛法

    python 中的代码:-

    def eratosthenes2(n):
        multiples = set()
        for i in range(2, n+1):
            if i not in multiples:
                yield i
                multiples.update(range(i*i, n+1, i))
    
    print(list(eratosthenes2(2000000)))
    

    来源 - http://rosettacode.org/wiki/Sieve_of_Eratosthenes#Python

    http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

    【讨论】:

      猜你喜欢
      • 2017-11-18
      • 2021-11-03
      • 2020-04-26
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多