Python最難的問題——直譯器全域性鎖(GIL)
阿新 • • 發佈:2019-01-30
Python的底層
要理解GIL的含義,我們需要從Python的基礎講起。像C++這樣的語言是編譯型語言,所謂編譯型語言,是指程式輸入到編譯器,編譯器再根據語言的語法進行解析,然後翻譯成語言獨立的中間表示,最終連結成具有高度優化的機器碼的可執行程式。編譯器之所以可以深層次的對程式碼進行優化,是因為它可以看到整個程式(或者一大塊獨立的部分)。這使得它可以對不同的語言指令之間的互動進行推理,從而給出更有效的優化手段。
與此相反,Python是解釋型語言。程式被輸入到直譯器來執行。直譯器在程式執行之前對其並不瞭解;它所知道的只是Python的規則,以及在執行過程中怎樣去動態的應用這些規則。它也有一些優化,但是這基本上只是另一個級別的優化。由於直譯器沒法很好的對程式進行推導,Python的大部分優化其實是直譯器自身的優化。更快的直譯器自然意味著程式的執行也能“免費”的更快。也就是說,直譯器優化後,Python程式不用做修改就可以享受優化後的好處。
這一點很重要,讓我們再強調一下。如果其他條件不變,Python程式的執行速度直接與直譯器的“速度”相關。不管你怎樣優化自己的程式,你的程式的執行速度還是依賴於直譯器執行你的程式的效率。這就很明顯的解釋了為什麼我們需要對優化Python直譯器做這麼多的工作了。對於Python程式設計師來說,這恐怕是與免費午餐最接近的了。