我的问题不是关于我的代码,而是关于python。我们家有一个编写代码的竞赛,我父母分别用C#和javascript编写了这个项目的版本我认为python应该和其他语言一样高效。我们最终编写了相同的代码(显然不同的语法),但是他们的文件在几毫秒内运行(221个来自我爸爸的javascript,500个来自我妈妈的c),而我的文件在5分钟内运行。这是一个荒谬的区别,让我质疑python到底是如何应用于现实世界的数据处理和算法求解的。
我用毕达哥拉斯数三元组解决了一个问题。问题是,如果a的平方+b的平方=c的平方,那么只有a,b和c的一个组合加起来等于1000。最后打印出1000所需的数字,分次打印。

for c in range(1000, 0, -1):
        for a in range(1000, 0, -1):
            for b in range(1000, 0, -1):
                if (a*a)+(b*b)==(c*c):
                    if a+b+c == 1000:
                        print("I have found it")
                        print(a*b*c)
                        quit()

最佳答案

与静态类型的语言相比,Python通常效率较低除了动态类型化之外,python在其他几个方面也非常动态,比如某些操作的长回退链、在任何iterable上工作的for循环、可以在非常广泛的对象集上工作的上下文管理器等。这些特性使得编程很方便,但通常要付出一定的代价因此,经过优化的Python程序通常会在C++、Haskell、Java等中使用相同的程序胜过。
但我认为主要的问题是你的算法效率不高。这里有三个循环,每个循环的范围超过999项。因此,这意味着内部循环最多执行997'002'999次我们可以重写算法,使其最多需要499500次迭代,如下所示:

for c in range(1000, 0, -1):
    for a in range(999-c, 0, -1):
        b = 1000-a-c
        if a*a + b*b == c*c:
            print("I have found it")
            print(a*b*c)
            quit()

实际上,我们可以通过从1000-a-c中获得这个值来计算b的有效值。此外,我们还可以通过在999-c范围内开始从a迭代来限制范围。
如果我们省略了printing和quit()ing,当我们运行函数1000次时,会得到以下结果:
>>> timeit(f, number=1000)
27.56889909002348

因此,这需要27.6毫秒。

07-25 21:42
查看更多