Python 運行機制
機器角度
當(dāng)Python"運行"時层扶,在代碼開始進行處理之前,Python會執(zhí)行一些步驟。
- 第一步 編譯成字節(jié)碼
程序執(zhí)行時场晶,Python會先將源代碼編譯成字節(jié)碼的形式拾并。字節(jié)碼是源代碼底層的揍堰、與平臺無關(guān)的表現(xiàn)形式Python通過把每一條源語句分解為單一步驟來將這些源語句翻譯成一組字節(jié)碼的執(zhí)行鹏浅。
字節(jié)碼可以提高執(zhí)行速度,要比源代碼的運行速度快的多 - Python會將字節(jié)碼生成一個以.pyc為擴展名的文件屏歹。字節(jié)碼可以讓使得程序啟動速度更加快速更加優(yōu)化隐砸,在下一次啟動后如果保存字節(jié)碼之后沒有修改過源代碼的話,Python將會加載.pyc文件并跳過編譯這個步驟蝙眶。如果Python無法在設(shè)備中寫入字節(jié)碼季希,程序依然可以工作,字節(jié)碼將會在內(nèi)存中生成并在程序結(jié)束時簡單的丟棄幽纷。
Python虛擬機 PVM
程序編譯成字節(jié)碼后式塌,.pyc文件載入后,字節(jié)碼文件通常發(fā)送到Python虛擬機上來執(zhí)行友浸。PVM不是一個獨立的程序峰尝,也不需要安裝。是Python的運行引擎收恢,在PVM運行字節(jié)碼文件后武学,Python解釋器的工作才算是結(jié)束。
性能解釋
Python字節(jié)碼不是機器的二進制代碼伦意。字節(jié)碼是特定于Python的一種表現(xiàn)形式汽煮,而C C++這類編譯語言需要build或者make的步驟尿背,所以Python無法像C C++代碼執(zhí)行一樣快的原因
開發(fā)含義
Python執(zhí)行模塊的另一個情況是開發(fā)和執(zhí)行環(huán)境是同一個環(huán)境内颗。Python編譯期總是在運行時出現(xiàn)蛾娶,并且是運行程序系統(tǒng)的一部分。在程序開始執(zhí)行之前不需要預(yù)編譯和連接缆八。這樣使得Python具有更多的動態(tài)特性曲掰。所有的事情都是在程序運行時發(fā)生的。甚至還包括建立函數(shù)和類的操作以及連接的模塊奈辰。
Python實現(xiàn)的替代者
Python語言主要有三種實現(xiàn)方式:CPython.Jython和IronPython栏妖。其中CPython是標(biāo)準的實現(xiàn)。其他的都是有特點的目標(biāo)和角色的奖恰。
CPython
CPython是原始的吊趾、標(biāo)準的Python實現(xiàn)方式通常稱作CPython。現(xiàn)在大多數(shù)的分發(fā)的Python都是從CPython.
JPython
JPthon也叫做Jython是一種Python語言的替代實現(xiàn)方式瑟啃。目的是為了與Java編程語言集成论泛。Jython中包含了Java類,這些類編譯Python源代碼蛹屿、形成Java字節(jié)碼屁奏,并將得到的字節(jié)碼映射到Java虛擬機上。
Jython的目標(biāo)是讓Python代碼能夠腳本化Java應(yīng)用程序错负。實現(xiàn)與Java的無縫集成坟瓢。Python代碼被翻譯成Java字節(jié)碼勇边。在運行時看起來就像一個真正的Java程序一樣,可以應(yīng)用與開發(fā)web applet和servlet
IronPython
IronPython的第三種實現(xiàn)方式IronPython的設(shè)計目的是讓Python程序可以與windows平臺上的.Net框架以及與之對應(yīng)的Linux上的開源項目編寫成相應(yīng)的繼承
模塊導(dǎo)入和重載
每一個以擴展名.py結(jié)尾的Python源代碼文件都是一個模塊折联,其它的其文件可以通過導(dǎo)入一個模塊讀取這個模塊的內(nèi)容粒褒。導(dǎo)入從本質(zhì)上來講,就是載入另一個文件诚镰。并能夠讀取那個文件的內(nèi)容奕坟。一個模塊的內(nèi)容通過這樣的屬性能夠被外部使用。
導(dǎo)入模塊是一個開銷很大的操作怕享,以至于每個文件执赡、每個程序運行不能夠重復(fù)多于1次镰踏。如果想要Python在同同一次會話中再次運行文件函筋,需要調(diào)用imp標(biāo)準庫模塊中可用的reload函數(shù)(Python2.6內(nèi)置 但在Python3.0中不是內(nèi)置的)
導(dǎo)入者得到了模塊文件中在頂層所定義的所有變量名。這些變量名通常被賦值給通過模塊函數(shù)奠伪、類跌帐、變量以及其他被導(dǎo)出的工具。
模塊和命名空間
Python程序往往由多個模塊文件構(gòu)成绊率,通過import語句連接在一起谨敛,每個模塊文件是一個獨立完備的變量包,即一個命名空間滤否。一個模塊文件不能呢個看到其他文件定義的變量名脸狸,除非顯式的導(dǎo)入了那個文件,所以模塊文件在代碼中起到了最小化命名沖突的作用藐俺。