【问题标题】:project Euler #12 - Difference between the two codes' performance项目 Euler #12 - 两种代码的性能差异
【发布时间】:2018-07-28 16:53:47
【问题描述】:

我最近开始学习 python,为了熟悉这些概念,我开始解决欧拉问题。我一直在尝试解决Euler's problem number 12,但是我的代码运行了很长时间(超过 10 分钟并且仍在运行)。我上网查了一下,跑了这段代码,没想到只用了11秒。但我无法理解两者之间的区别。如果有人能帮助我理解其中的区别,真的很感激

我的代码 #1:

from time import time
import math

def divisors(n):
    n = int(n)
    sqrt = int(math.sqrt(n))
    result = sum(2 for i in range(1, sqrt+1) if n%i == 0)
    for i in range(1, n+1):
        if i**2 == n:
            result = result - 1
    return result
i = 1
num = 0
a = 0
t = time()
while a < 500:
    num = num+i
    print(num, i)
    i = i+1
    a = divisors(num)
print(a)
tt = time() - t
print(tt)

我的代码 #2

from time import time
import math

def divisors(n):
    n = int(n)
    sqrt = int(math.sqrt(n))
    for i in range(1, n+1):
        result = sum(2
                     for i in range(1, sqrt+1) if n%i == 0)
        if i**2 == n:
            result = result - 1
    return result

i = 1
num = 0
a = 0
t = time()
while a < 500:
    num = num+i
    print(num, i)
    i = i+1
    a = divisors(num)
print(a)
tt = time() - t
print(tt)

耗时 11 秒的代码:

import math
from time import time
t = time()
def divisors(n):
    number_of_factors = 0
    for i in range(1, int(math.ceil(math.sqrt(n)))):
        if n % i == 0:
            number_of_factors +=2
        else:
            continue
    return number_of_factors

x=1
for y in range(2,1000000):
    x += y
    if divisors(x) >= 500:
        print x
        break
tt = time()-t
print tt

【问题讨论】:

  • 您的代码 #2 在循环中计算 result,应该在循环之外。
  • code#1 怎么样?

标签: python loops numbers


【解决方案1】:

最好用算法标签问这个问题。

无论如何,区别在于函数除数的实现。

对于divisors(n),您的代码中此函数的复杂性是此行的 O(n) 原因: for i in range(1, n+1): 但在第三个代码中,divisors(n)的复杂度为 O(sqrt(n))

您可以通过编辑divisors 函数来改进您的代码

我的提示:1 + 2 + 3 + ... + n = n*(n + 1) / 2 它不可能是完美的正方形...

【讨论】:

  • 天啊,是的!唉,真是个愚蠢的错误!谢谢,我会试试你说的。
猜你喜欢
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
相关资源
最近更新 更多