2012-07-06 40 views
2

好吧,我试图扔在一些真正大量的蟒蛇评估 - 10 ^(10^120)的秩序 - 然后我意识到是相当巨大。无论如何,我然后退到10 ** 10 ** 5和10 ** 10 ** 6。检查两者的时间差异使我感到这种有点奇怪的发现,我认为这是一种低效率。Python是否每次使用resut重新评估算术运算?

的发现是,当我试图cProfile.run("x=10**10**6")0.3秒cProfile.run("print 10**10**6")40年代

然后我试图x= 10**10**6历时几乎没有时间,但此后每次我解释x时间(后面x进入),这将需要很长一段时间(40年代想)。所以,我假设每次我解释x它都会再次计算整个值。

所以我的问题是:是不是非常低效?假设我已经在一个模块中声明了一些变量,x= 10**10,并且每当我参考x时,python解释器会一次又一次计算10**10的值?

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

+3

Python解释器中的>>> print x'和>>> >>>之间在计算时间方面确实没有区别。他们都在做同样的事情。大部分时间可能会被字符串转换所占用。 – senderle 2012-07-06 22:14:23

+3

'参考'与'print'不一样。您可以整天以很少的成本引用'x'变量。当你使用REPL来执行时,有一个隐含的'__repr__':'x [enter]' – jdi 2012-07-06 22:15:21

回答

7

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

10

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

例如:(什么好几个欧拉项目要求) -

是什么,比方说所有数字的总和,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键)变量名/打印变量名,它的表演交流onversion。

+0

你是对的。如果我做了这一个更多的测试,我可以得出相同的结论。 'x =(10 ** 10 ** 7)/(10 ** 10 ** 7); x'。后者与我所设想的非常相反。 – 2012-07-06 22:32:24

+0

不挑剔,但该代码并不真的产生一个非常大的数字。 '44221'。但是我确实得到了str转换是主要时间点的观点。 – 2012-07-06 22:53:09