影想Python編譯的過(guò)程控制的三個(gè)參數(shù)詳細(xì)介紹
今天我們將給大家介紹一下Python編譯的過(guò)程控制是如進(jìn)行的,以下的文章就是通過(guò)Python對(duì)相關(guān)字節(jié)碼進(jìn)行一些優(yōu)化,以及所需優(yōu)化的相關(guān)代碼,下面的文章就是對(duì)Python編譯的過(guò)程控制的相關(guān)步驟的介紹。
介紹一下如何“稍微”Python編譯的過(guò)程控制。只所以說(shuō)是稍微,是因?yàn)闊o(wú)論何種情況,Python都會(huì)對(duì)字節(jié)碼進(jìn)行一些簡(jiǎn)單優(yōu)化(basic Peephole Optimization,詳情參見(jiàn)Python的源代碼。2.5版本的Python位于 Python/compile.c,2.7版本則位于Python/peephole.c)。這些優(yōu)化不能通過(guò)環(huán)境變量或者命令參數(shù)將其禁用。比如:
- if True:
- return 1
- else:
- return 0
會(huì)被優(yōu)化成為:
- return 1
更多的優(yōu)化正被添加到Python源代碼內(nèi)。只有三個(gè)參數(shù)能影響Python編譯時(shí)的優(yōu)化:
第一、去除所有的assert語(yǔ)句,并將__debug__這個(gè)內(nèi)置變量的值設(shè)置為False。方法是運(yùn)行Python的時(shí)候在命令行添加參數(shù):
- python -O im.py
第二、除了第一條所做的事情,還去除所有docstring。方法是運(yùn)行Python的時(shí)候在命令行添加參數(shù):
- python -OO im.py
第三、默認(rèn)的,對(duì)于一個(gè)模塊,Python編譯后的字節(jié)碼會(huì)被保存到與源代碼相同的文件夾內(nèi)。這樣就可以加速模塊的載入速度。大多數(shù)使用Python的朋友們都寫(xiě)過(guò)包含兩三個(gè)文件的程序。通常可以發(fā)現(xiàn)除了.py文件之外,文件夾內(nèi)還會(huì)有.pyc文件。
mymodule.pyc文件即是mymodule.py的字節(jié)碼。如果運(yùn)行Python的命令行包含了”-O”或者”-OO”參數(shù),Python會(huì)將優(yōu)化后的字節(jié)碼保存到mymodule.pyo文件。想要禁止生成.pyc或者.pyo文件,可以在運(yùn)行Python的時(shí)候,在命令行里添加參數(shù):
- python -B im.py
還可以設(shè)置環(huán)境變量:
- c:\> set PYTHONDONTWRITEBYTECODE=x
看完上面三條說(shuō)明,有的朋友可能會(huì)疑問(wèn),”-O”和”-OO”參數(shù)真的就干那三件事?不幸的是,還真是如此。至少在Python2.5的時(shí)候就是這樣。所以加”-O”參數(shù)并不能明顯優(yōu)化Python的運(yùn)行速度。這兩個(gè)選項(xiàng)的真正作用是區(qū)分調(diào)試版本和發(fā)行版本。在程序中可以盡量多增加一些assert語(yǔ)句,以便程序員在調(diào)試階段發(fā)現(xiàn)一些隱藏的錯(cuò)誤。而在發(fā)布時(shí),將這些語(yǔ)句去除。如果你的軟件是商業(yè)軟件的話,加上”-OO”參數(shù)可以讓別人看不清內(nèi)部函數(shù)的用途,增加一些破解的難度。有了這些,誰(shuí)還說(shuō)Python不能寫(xiě)商業(yè)軟件?以上的文章就是對(duì)Python編譯的過(guò)程控制的實(shí)際應(yīng)用方案的具體介紹。
【編輯推薦】
























