【问题标题】:Is there any way to make long iterative codes in python not take progressively longer to run as they take on more and more information?有什么方法可以使 python 中的长迭代代码随着它们获取越来越多的信息而不会花费越来越长的时间来运行?
【发布时间】:2020-12-02 00:33:56
【问题描述】:

我注意到我最近尝试使用的一些用于将 pi 的数字查找到多个小数的代码开始运行得非常快,通常每秒达到数千个小数(可能被夸大了,但每秒的数量相当可观),但在达到 10 000 或更高的小数点后,每秒只会添加 50 个左右的小数点。

我之前听说有一些方法可以构建您的代码,这样您就不会出现此问题。我不确定它是否是通过摆脱已经处理的数字或其他东西来完成的。

一些可能有用的代码,尽管我正在寻找更多我可以使用的技术的一般答案,而不是针对我现在的特定用例的技术。

这是查找数字的代码:

 while counter != decimal + 1:
            if 4 * q + r - t < n * t:
                    # yield digit
                    yield n
                    # insert period after first digit
                    if counter == 0:
                            yield '.'
                    # end
                    if decimal == counter:
                            print('')
                            break
                    counter += 1
                    nr = 10 * (r - n * t)
                    n = ((10 * (3 * q + r)) // t) - 10 * n
                    q *= 10
                    r = nr
            else:
                    nr = (2 * q + r) * l
                    nn = (q * (7 * k) + 2 + (r * l)) // (t * l)
                    q *= k
                    t *= l
                    l += 2
                    k += 1
                    n = nn
                    r = nr

打印数字的代码:

  for d in pi_digits:
            print(d, end='')
            i += 1
            if i == 100:
                print("")
                i = 0

另外,我目前以 100 行打印 pi 的数字,我是否可以通过减少或增加一行中的位数来获得任何速度优势,这样代码就不必经常换行?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    很确定“问题”与 python 的底层“大整数”实现有关。

    如果数字很小,python 可以使用常见的 32/64 位值来表示它们,但是有一个限制。由于 python 的目标是易于使用,因此它切换到大于称为“bignum”的数字的自定义实现。虽然我不确定 python 是如何实现这一点的,但大多数 BigNum/BigInt/etc 实现使用一个数组来表示每个数字。因此,如果我们在 bignum 结构中表示 123,我们会将每个数字存储在数组中的单独项中,如下所示:

    value = [1, 2, 3]
    

    这对于存储数字来说很好,但正如您所料,它不适合进行操作。处理器可以很好地处理 32/64 位值运算,但他们不知道如何将 [1, 2, 3][6, 2, 1, 5] 相乘。这意味着为了处理这些操作需要运行大量的 Python 代码,而且速度很慢。

    如果您这样做只是为了好玩,保持原样,或者尝试使用更快的 BigInt 实现以较低级别的语言编写相同的内容,我的建议是,但如果您真的需要快速编写此代码,只要涉及数字,并且您需要快速运行的东西,可能有一个 numpy 结构或算法可以帮助您,因为它使用 C 代码来运行东西。搜索“numpy bigint”、“numpy large numbers”等,你会找到一些方法来加速你的算法。

    【讨论】:

      【解决方案2】:

      不幸的是,您正在使用越来越大的数字进行计算,这会占用更多的内存空间,并且执行计算所需的时间越来越长,因此代码将不可避免地需要更长的时间来运行。

      已经处理的数字将被自动处理,因为无论如何您都在用它们的新值替换变量。

      至于打印语句,我怀疑它会对性能产生任何明显影响,但为了简单起见,我建议使用以下代码替换您当前的代码:

      print("".join(pi_digits))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-23
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-12
        • 1970-01-01
        相关资源
        最近更新 更多