2015-01-15 68 views
2

我正在努力優化程序的運行時間,並且想知道Python在幕後究竟做了什麼「==」。特別是,我注意到它可以檢查兩個大的「相似」對象是否真的很快。例如,如果您有兩個長度爲1000萬的字符串,並且它們只有一個字符的不同,那麼在它們上運行==需要的時間與運行2 == 3的時間相當。Python的「==」真的做了什麼

+0

事情是字符串在python中是不可變的,所以它可能檢查字符串的id,像這樣str1 == str2與id(str1)== id(str2)相同, ,它不依賴於字符串長度 –

+0

@batiskaf具有相同值的不可變對象不需要具有相同的'id'。也就是說,'s1 =「這是一個測試」; s2 =「這是一個測試」; id(s1)== id(s2)'可以返回False(實際上,它在我的機器上)。 – jme

+0

他們在第一個字符或最後一個字符有所不同嗎? –

回答

6

==代表左側對象的__eq__特殊方法,如果有的話。而字符串對象肯定有一個,並且它是高度優化的。所以這就是它的全部...

+0

得到了你。我想到了這一點,但認爲這是不可能的,因爲我用time.time()計算了上述兩種情況,並得到了相同的結果。實際上有一個區別,它只是非常小。我再次測試了它們,這次重複了億次的==操作,得到了2.07秒的差異。我仍然對字符串alg好奇。雖然看起來像比較int alg長度10^7的字符串一樣快。在比較2和3! –

+2

查看第1192行和後面的「Py-2.7.9/Objects/stringobject.c」(當然下載和解壓縮源代碼之後:-),你將在今天的C編譯器和CPU中看到魔術的全部硬件 - 它只是'memcmp',在比較字符串長度和第一個字符後可能發生快速失敗。 –