每次使用Result时,Python是否都会使用bignum重新评估算术运算?

每次使用Result时,Python是否都会使用bignum重新评估算术运算?,python,Python,好的,我试着对python进行一些非常大的评估——大约10^(10^ 120)——然后我意识到这相当大。不管怎样,我后来退到10**10**5和10**10**6。通过检查两者的时差,我发现了一个有点奇怪的发现,我认为这是一个低效的发现 结果是,当我尝试cProfile.run(“x=10**10**6”)时,花费了0.3秒,cProfile.run(“print 10**10**6”)花费了40秒 然后我尝试了x=10**10**6,几乎不花时间,但此后每次我解释x(x,后跟enter)都需要

好的,我试着对python进行一些非常大的评估——大约10^(10^ 120)——然后我意识到这相当大。不管怎样,我后来退到10**10**5和10**10**6。通过检查两者的时差,我发现了一个有点奇怪的发现,我认为这是一个低效的发现

结果是,当我尝试
cProfile.run(“x=10**10**6”)
时,花费了0.3秒,
cProfile.run(“print 10**10**6”)
花费了40秒

然后我尝试了
x=10**10**6
,几乎不花时间,但此后每次我解释
x
x
,后跟enter)都需要很长时间(我想是40秒)。因此,我假设每次我解释
x
时,它都会重新计算整个值

所以我的问题是:这不是非常低效吗?假设我在一个模块中声明了某个变量,
x=10**10
,每次我引用
x
,python解释器都会一遍又一遍地计算
10**10
的值


血淋淋的细节将不胜感激。

Python可以使用二进制计算非常大的数字,但要将其转换回可以显示的数字,需要大量的工作

例如:(还有很多Euler项目所要求的)——

例如,
2**32768

Python可以使用BigNum将结果计算为一个非常直接的数字,但只要您这样做:

sum(int(c) for c in str(my_big_number)) # ouch - that's a lot of digits to produce and store

这就是当您键入(然后按enter键)变量名/打印变量名时发生的情况,它正在执行转换。

每次打印时都不会重新计算值,您看到的长延迟是将大数字转换为字符串以显示的成本。

实际上没有区别,就计算时间而言,在Python解释器中打印x和x之间。他们都在做同样的事情。大部分时间可能被字符串转换占用。“reference”与“print”不同。您可以全天使用
x
变量,成本很低。当您使用REPL执行操作时,有一个隐含的
\uuuu repr\uuuu
x[enter]
您是对的。如果我再做一次测试,我也会得出同样的结论<代码>x=(10**10**7)/(10**10**7);x。后者的速度非常快,与我之前的假设相反。虽然不挑剔,但代码并不会产生非常大的数字<代码>44221是的。但我确实明白str转换是主要的时间消耗。