【问题标题】:Python exponentiation speedPython求幂速度
【发布时间】:2018-12-15 22:47:45
【问题描述】:

知道如何估计这个程序需要多长时间吗?我已经运行了 8 个小时的程序,不知道还要等多久。

print (9 ** ((9 ** 9) + 9))

我知道答案是巨大的(我知道它会溢出数十亿位数)。我只是想知道需要多长时间。

【问题讨论】:

  • 打印所需的时间是精明的。到控制台的 IO 是 s l o w 。 - 你正在测量控制台的输出 - 而不是计算它所需的时间。
  • 好的,但是为什么要计算这个呢?
  • 时间取决于您的机器,即您的 CPU、RAM、硬盘(因为不,我认为您的 RAM 不够大)、您的操作系统...我不认为任何人都为此程序制定了基准;)
  • 嗯,这应该小于 10**10 位。 Python 每个数字需要大约 0.45 个字节。这意味着最终数字约为 5 GB 内存。预计约。 2个临时变量需要计算相同的大小。所以大约 15 GB。因此,只需开始计算并监控您的 RAM 使用情况。然后推断达到该数字需要多长时间。这应该给你一个数量级的估计......
  • 在基数 9 中,您的答案是 1 后跟 0 387,420,498 次。

标签: python performance number-theory


【解决方案1】:

如上所述,您正在进行两个单独的计算。第一个是 9**((9**9) + 9) 的幂运算。第二个是将结果转换为十进制字符串格式。第二次计算比第一次计算慢得多。

让我们看看 9**((N**N)+N) 在我的计算机上的大概运行时间。

对于 N=6,求幂需要 0.01 秒。转换为十进制字符串需要 0.02 秒。

对于 N=7,求幂需要 0.15 秒。转换为十进制字符串需要 6.9 秒。

对于 N=8,求幂需要 16.9 秒。转换为十进制字符串需要 48 分钟。

对于 N=9,求幂需要 40 分钟。转换为十进制字符串需要很长时间 - 可能需要几个星期。

Python 的整数到字符串的转换算法是 O(n^2) 并且它的运行时间最终会占主导地位。还有其他库可以更快地执行计算。 GMPY2 将在 2 分钟内完成这两项计算。有关更多详细信息,请查看此问题的第二个答案:

How can I convert an absolutely massive number to a string in a reasonable amount of time?

【讨论】:

    【解决方案2】:

    算术 (9**(N**N+N)) 的时间与N 的比例非常好(并且呈指数级),如下图所示。我的比赛大约需要 48 分钟来计算 N=9 的答案。 然而,在某些时候,你的数字的文字表示不适合 RAM,这就是交换/分页开始的地方,并且由于不可预测的因素而减慢了整个事情的速度。

    (我知道这并不能回答您的问题,但我仍然想分享图表。请随意标记/否决。)

    【讨论】:

    • 你的 y 轴刻度是多少?
    • 以秒为单位的时间,由%timeit测量。
    • 如果我没看错,你能计算出 9 ** (8 ** 8 + 8) 不到一秒?我不相信。
    • 因此,如果您使用 Big-O 表示法来描述它的运行时间,则它的运行时间为 O(n^2) 或更糟。
    • @CeciliaChen 不,在 29 秒内 - 但是,再次以 %timeit 衡量。实际运行时间要长得多。
    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2021-06-04
    • 2010-10-12
    相关资源
    最近更新 更多