Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Euler项目-这个haskell代码怎么会这么快?_Python_Haskell_Python 3.x - Fatal编程技术网

Python Euler项目-这个haskell代码怎么会这么快?

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(

我正在处理euler项目中的问题401,我用python编写了我的解决方案,但运行起来需要几天时间,显然我需要加快速度或使用不同的方法。我在Haskell中遇到了一个解决方案,它看起来几乎与我的python解决方案相同,但几乎是在瞬间完成的

有人能解释为什么这么快吗?(我不是请求帮助或解决问题401

根据我的理解,它只是使用除法生成一个除数列表,对除数进行平方和求和,然后将结果从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()

请确保您在计算时使用的是
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