【发布时间】:2014-02-19 00:19:42
【问题描述】:
我正在处理项目 euler 中的问题 401,我在 python 中编写了我的解决方案,但它需要几天时间才能运行,显然我需要加快速度或使用不同的方法。我在 Haskell 中遇到了一个看起来与我的 python 解决方案几乎相同但几乎瞬间完成的解决方案。
有人能解释一下它怎么这么快吗? (我不是在寻求帮助或解决问题 401)
divisors n = filter (\x -> n `mod` x == 0) [1..(n`div`2)] ++ [n]
sigma2 n = sum $ map (\x -> x * x) (divisors n)
sigma2big n = sum $ map (sigma2)[1..n]
let s2b = sigma2big 10^15
putStrLn ("SIGMA2(10^15) mod 10^9 is " ++ (show (mod s2b 10^9)))
据我了解,它只是使用试除法生成一个除数列表,对它们进行平方和求和,然后将结果从 1 到 n 求和。
编辑:忘记了我的 python 代码
from time import clock
def timer(function):
def wrapper(*args, **kwargs):
start = clock()
print(function(*args, **kwargs))
runtime = clock() - start
print("Runtime: %f seconds." % runtime)
return wrapper
@timer
def find_answer():
return big_sigma2(10**15) % 10**9
def get_divisors(n):
divs = set()
for i in range(1, int(sqrt(n)) + 1):
if n % i == 0:
divs.add(i)
divs.add(n // i)
return divs
def sigma2(n):
return sum(map(lambda x: x**2, get_divisors(n)))
def big_sigma2(n):
total = 0
for i in range(1, n + 1):
total += sigma2(i)
return total
if __name__ == "__main__":
find_answer()
【问题讨论】:
-
如果您也向我们展示您的 Python 代码,那肯定会有所帮助。
-
真正的问题可能是:为什么你的 Python 代码这么慢。
-
我不知道 Haskell,但我对为什么你的代码这么慢的两个猜测是你的代码构建了明确的列表并设置了 Haskell 代码懒惰的地方,而 Haskell 被编译为本机Python是字节码解释的代码。特别是,如果这是 Python 2,
range(1, 10**15+1)会吃掉你所有的内存。 -
有趣的是,几天后结束时,你将不知道它是否真的正确,因为它只是忽略了结果......
-
@abarnert 是的,我省略了使用装饰将代码包装在计时器中的部分,否则它确实不会显示结果。
标签: python haskell python-3.x