python - python 在 for 循环中效率低得令人难以置信,还是只是我的代码?

标签 python python-3.x algorithm pythagorean

我的问题不是关于我的代码,而是关于 python 的一般问题。我们家有一场编程竞赛,我的 parent 分别用 C# 和 javascript 编写了这个项目的版本。我认为 python 应该与其他语言一样高效,甚至更高。我们最终编写了相同的代码(明显不同的语法),但他们的文件在几毫秒内运行(我爸爸用 Javascript 运行 221 秒,我妈妈用 C# 运行 500 秒),而我的文件在大约 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 在其他几个方面也非常动态,例如某些操作的长回退链、适用于任何可迭代对象的 for 循环、上下文管理器等,它们可以适用于非常广泛的范围一组对象。这些功能使编程变得方便,但通常需要一定的成本。因此,经过优化的 Python 程序经常会被 C++、Haskell、Java 等等效程序超越。

但我认为主要问题是你的算法效率不是很高。这里有三个循环,每个循环的范围超过 999 个项目。因此,这意味着内部循环最多执行 997'002'999 次。我们可以重写算法,使其最多需要 499'500 次迭代,如下所示:

for c in range(1000, 0, -1):
    for a in range(999<b>-c</b>, 0, -1):
        <b>b =</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 的有效值。此外,我们可以通过从 a 范围内的 999-c 开始迭代来限制范围。

如果我们省略 printing 和 quit()ing,当我们运行该函数 1'000 次时,我们将获得以下结果:

>>> timeit(f, number=1000)
27.56889909002348

因此运行时间为 27.6 毫秒。

关于python - python 在 for 循环中效率低得令人难以置信,还是只是我的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58053244/

相关文章:

python - Gremlin 在创建的顶点中添加多标签

python - 使用 pandas web.DataReader 从整个索引(例如 DJIA)中获取数据

python-3.x - 为什么安装成功后无法导入pandas?

algorithm - 如何使用堆栈(后进先出)实现 FIFO,对于 FIFO 的推送和弹出操作具有相同的复杂性

algorithm - 连接 PCM 文件的算法是什么?

python - 狮身人面像文档 : define but hide heading/title text

python - 根据值列表在 python 中重新排序字典

python - Python 中序列 __getitem__ 的原型(prototype)定义是什么?

python - 当模型中的 DateField 过期时触发函数的最佳方式

java - ArrayList中合并对象的高效算法