欧拉项目#12-两种代码的性能差异

时间:2018-07-28 16:53:47

标签: python loops numbers

我最近开始学习python,为了熟悉我开始解决Euler问题的概念。我一直在尝试解决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

1 个答案:

答案 0 :(得分:0)

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

无论如何,功能除数的实现是不同的。

由于df.select("value").collect.mkString(",").replaceAll("[\\[\\]]","") 在您的代码中此函数的复杂性是此行的O(n)原因: df.map(row=>row.getAs("value").toString).collect.mkString(",") 但在第三段代码中,divisors(n)的复杂度为O(sqrt(n))

您可以通过编辑 for i in range(1, n+1): 函数来改善代码

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