Python Euler项目-这个haskell代码怎么会这么快?
我正在处理euler项目中的问题401,我用python编写了我的解决方案,但运行起来需要几天时间,显然我需要加快速度或使用不同的方法。我在Haskell中遇到了一个解决方案,它看起来几乎与我的python解决方案相同,但几乎是在瞬间完成的 有人能解释为什么这么快吗?(我不是请求帮助或解决问题401) 根据我的理解,它只是使用除法生成一个除数列表,对除数进行平方和求和,然后将结果从1到n求和 编辑:忘记我的python代码了Python Euler项目-这个haskell代码怎么会这么快?,python,haskell,python-3.x,Python,Haskell,Python 3.x,我正在处理euler项目中的问题401,我用python编写了我的解决方案,但运行起来需要几天时间,显然我需要加快速度或使用不同的方法。我在Haskell中遇到了一个解决方案,它看起来几乎与我的python解决方案相同,但几乎是在瞬间完成的 有人能解释为什么这么快吗?(我不是请求帮助或解决问题401) 根据我的理解,它只是使用除法生成一个除数列表,对除数进行平方和求和,然后将结果从1到n求和 编辑:忘记我的python代码了 from time import clock def timer(
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()
请确保您在计算时使用的是
Integer
,而不是Int
,因为10^15
将溢出Int
值
如果您更改:
let s2b = sigma2big 10^15
致:
Haskell代码在ghci
中耗尽了内存,在运行编译版本时,我没有费心等待它完成
Prelude> sigma2big 1000
401382971
(0.48 secs, 28491864 bytes)
Prelude> sigma2big 10^3
103161709
(0.02 secs, 1035252 bytes)
Prelude> (sigma2big 10)^3
103161709
函数优先级(shh…如果你也向我们展示你的python代码,那肯定会有帮助。真正的问题可能是:为什么你的python代码这么慢。我不知道Haskell,但我对你的代码为什么这么慢的两个猜测是,你的代码构建显式列表,并设置Haskell代码懒惰的位置,Haskell被编译成本机代码,其中Python是字节码解释的。特别是,如果这是Python2,
range(1,10**15+1)
将消耗你所有的内存。有趣的是,几天后,当它结束时,你将不知道它是否真的正确,因为它忽略了结果…@abarnert Yea我遗漏了我使用装饰的计时器包装代码的部分,如果没有这一点,它确实不会显示结果。haskell代码不是我的,我编写了python代码。我想知道为什么haskell代码比我的快得多。这是不正确的。正如另一个答案所指出的,这是您看到的(sigma2big 10)^15/=sigma2bit(10^15)
的区别。其他不明确积分的默认类型实际上是默认的整数。。。非常感谢你。
let s2b = sigma2big (10^15 :: Integer)
Prelude> sigma2big 1000
401382971
(0.48 secs, 28491864 bytes)
Prelude> sigma2big 10^3
103161709
(0.02 secs, 1035252 bytes)
Prelude> (sigma2big 10)^3
103161709