【发布时间】:2014-11-15 10:55:45
【问题描述】:
这个问题是关于欧拉Problem 21:
基本算法是建立一个查找表d_value,当我们从2 到10000 时,它将存储number: d(number)。
那么为了尽可能少的调用d()函数。
只要我们有一个号码,我们就会检查这个号码是否已经存在于d_value.keys() 中。
如果没有,那么我们将添加这个值为d(number) 的键。
d_number 也是如此。
然后我们比较它是否符合定义,如果符合,我们将number添加到amicable_number_sum。
然后下一个number。
我的代码是这样的:
from math import sqrt
def d(number):
sum = 1
for foo in range(2, int(sqrt(number)) + 1):
if number % foo == 0:
sum += foo
sum += number/foo
return sum
d_value = {}
amicable_number_sum = 0
for number in range(2, 10000):
if not number in d_value.keys():
d_value[number] = d(number)
if not d_value[number] in d_value.keys():
d_value[d_value[number]] = d(d_value[number])
if number == d_value[d_value[number]] and not number == d_value[number]:
amicable_number_sum += number
print amicable_number_sum
此代码需要 2.14 秒才能完成。
然后是我试图“避免”的蛮力方法,它需要 0.147 秒才能完成。 :(
只要我们需要知道一个数字的d(),它就会调用函数d()。
from math import sqrt
def d(number):
sum = 1
for foo in range(2, int(sqrt(number)) + 1):
if number % foo == 0:
sum += foo
sum += number/foo
return sum
amicable_number_sum = 0
for number in range(2, 10000):
d_value = d(number)
if d(d_value) == number and not number == d_value:
amicable_number_sum += number
print amicable_number_sum
那么我的代码的哪一部分一直在占用?
我的猜测是两个if 用字典键检查。
但由于我无法检查代码中的时间消耗(有吗?),我想听听您对此的看法。
【问题讨论】:
-
如果这是一个算法问题,请尝试描述算法而不是代码。
-
@simonzack 感谢您的建议。我已将算法移至帖子的开头部分。
标签: python performance time