我的问题不是关于我的代码,而是关于 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
开始迭代来限制范围。
如果我们省略 print
ing 和 quit()
ing,当我们运行该函数 1'000 次时,我们将获得以下结果:
>>> timeit(f, number=1000)
27.56889909002348
因此运行时间为 27.6 毫秒。
关于python - python 在 for 循环中效率低得令人难以置信,还是只是我的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58053244/