【发布时间】:2015-05-05 22:48:00
【问题描述】:
在尝试Euler 99 时,我注意到这些操作需要不同的时间:
>>> 632382**518061 # never finishes..
>>> 632382**518061 > 519432**525806 # finishes in few seconds
True
我想知道这是什么原因?
【问题讨论】:
-
作为一个附带问题,当 Python 编译器看到
632382**518061时,它会想,“嘿,对两个小的整数文字进行简单操作,我将在编译时执行此操作并对其进行常量折叠”。因此,编译该行代码需要大约 3 秒,但运行它只需要 20 纳秒(然后格式化要打印的字符串需要 200 秒……)。在交互式解释器上没关系(除非您尝试使用timeit进行基准测试),但将其放入一个模块和import该模块中,第一次需要3 秒,但如果你再做一次(即使在退出并重新启动后)也不会。 -
顺便说一句,即使没有阅读问题 99,我怀疑它的重点是给你的数字太大而无法实际计算,所以你必须知道和/或查找并学习一些像模幂运算或从每一边除以因子,仅在没有公因子时计算或估计然后测试误差范围的技巧。
-
在第一个示例中尝试显示多位数字时,内存和时间都会受到影响。第二,没有尝试实际显示,只是简单的比较,不会像打印到标准输出那样耗费时间。
标签: python optimization largenumber exponentiation