Python需要更多时间来打印计算而不是执行计算

Aay*_*jan 4 python variables performance numerical-computing

我在python中写了一个脚本,这让我感到惊讶.基本上,它需要五个20位数字,然后将它们相乘,然后将它们提升到3000的幂.时间模块用于查找计算计算所需的时间.好吧,当我运行这个脚本时,它说需要3*10 ^ -7秒来计算它.然后它生成一个文件output.txt,但脚本直到大约15秒后才会结束.

import timeit
outputFile = open("output.txt", "w")
start = timeit.default_timer()
x = (87459837581209463928*23745987364728194857*27385647593847564738*10293769154925693856*12345678901234567891)**3000
stop = timeit.default_timer()
time = stop-start
print "Time taken for the calculation was {} seconds".format(time)
outputFile.writelines(str(x))
outputFile.close()
y = raw_input("Press enter to exit.")
Run Code Online (Sandbox Code Playgroud)

这是否意味着打印280kb文件实际上需要花费更长的时间而不是执行计算?(我发现它不太可能.)

如果不是这样,那么python是否在调用变量x时执行计算?它是在每次计算变量时执行计算,还是将实际值存储在变量中?

我刚刚编写了另一个脚本,它确认将结果写入.txt文件需要python 0.03秒.那么,为什么python稍后会执行计算呢?

Tim*_*ers 7

这不是计算问题,也不是写入文件:通过将结果从其内部二进制表示转换为基数10表示来消耗大量时间.这需要时间二次方的位数,这里你有很多位.

如果您将输出行替换为:

outputFile.writelines(hex(x))
Run Code Online (Sandbox Code Playgroud)

你会发现它的运行速度非常快.转换为十六进制表示仅需要时间线性的位数.

如果你真的需要在基数10表示中输出巨型整数,那么请考虑使用decimal模块.这在与基数10相关的表示中进行内部计算,然后转换为十进制字符串需要在十进制数字的数量上呈线性.但是,您需要提前将小数上下文的精度设置为"足够大"的值,以避免丢失低位数到舍入.

  • 因为Python longs内部存储在(基本上)base 2**15中,并且CPython没有做出英勇的努力来使用2次幂和10次幂之间的次二次基本转换算法.它使用或多或少明显(和二次时间)算法("一次一个输出数字"). (2认同)