2012-07-06 66 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