久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > python之什么是字節(jié)碼(bytecode)?

        python之什么是字節(jié)碼(bytecode)?

        來源:千鋒教育
        發(fā)布人:xqq
        時(shí)間: 2023-11-06 23:56:43 1699286203

        簡(jiǎn)單的說它就是一個(gè)從源代碼編譯而來的中間文件(用于不同操作系統(tǒng)平臺(tái)的解釋器執(zhí)行)。比如,a說日語,b說中文,溝通起來不暢通,請(qǐng)一個(gè)翻譯,把a(bǔ)和b的語言都翻譯成英語,這個(gè)英語就可以理解成bytecode,一種中間語言。

        bytecode的好處就是加載快,而且可以跨平臺(tái),同樣一份bytecode,只要有操作系統(tǒng)平臺(tái)上有相應(yīng)的Python解釋器,就可以執(zhí)行,而不需要源代碼。不同版本的Python編譯的字節(jié)碼是不兼容的,Python2.6編譯的bytecode拿到Python2.7上去執(zhí)行就不行了。

        如何生成字節(jié)碼?

        Python解釋器一般會(huì)自動(dòng)把.py文件轉(zhuǎn)換成bytecode,然后再執(zhí)行它。當(dāng)你第一次把.py文件當(dāng)作module導(dǎo)入,或者對(duì)應(yīng)的.py文件比.pyc文件的修改時(shí)間還要新時(shí),Python解釋器都會(huì)再從sourcecode生成相應(yīng)的新bytecode。這樣當(dāng)你下次再次運(yùn)行程序時(shí),就會(huì)直接從bytecode運(yùn)行,從而節(jié)省便宜時(shí)間。

        Ps:這里需要注意,有些情況bytecode并不會(huì)生成:

        遇到目錄寫權(quán)限的問題時(shí)。(比如你編寫代碼和運(yùn)行代碼使用的具有不同權(quán)限的用戶角色,Linux上很常見)

        運(yùn)行一個(gè)script并不會(huì)被當(dāng)成是import操作,所以可能也不會(huì)生成bytecode。(比如:你有個(gè)一個(gè)a.py的文件,其中在a.py里,你import了b.py,那么運(yùn)行pythona.py后,會(huì)生成b.pyc,而不會(huì)生成a.pyc)

        .pyc文件是什么?

        Python源碼編譯的結(jié)果就是PyCodeObject,每個(gè)作用域會(huì)編譯出一個(gè)對(duì)應(yīng)的代碼對(duì)象,其中名為co_code的PyStringObject保存著代碼對(duì)象的字節(jié)碼。

        一個(gè)Python源文件就是一個(gè)模塊。每個(gè)模塊頂層的代碼對(duì)象通過marshal序列化之后就得到了.pyc文件。marshal以little-endian字節(jié)序來序列化數(shù)據(jù)。

        那嵌套于頂層作用域里面的那些作用域,例如函數(shù)、類的定義,它們對(duì)應(yīng)的代碼對(duì)象在哪里?它們每一個(gè)都乖乖的躺在上一層作用域的代碼對(duì)象的co_const(常量池)域里,所以其實(shí)頂層代碼對(duì)象已經(jīng)嵌套包含了底下其它作用域的代碼對(duì)象。

        如何對(duì).pyc文件文件進(jìn)行反編譯?

        python文件如果要發(fā)布的話,有時(shí)候還是難免想保護(hù)一下自己的源碼,有些人就直接編譯成了pyc文件,因?yàn)檫@樣既可以保留跨平臺(tái)的特性,又可以不能直接看到代碼,也看到網(wǎng)上很多人說為了保護(hù)自己的代碼可以編譯成pyc文件。

        用pyc文件可以保護(hù)python代碼的想法其實(shí)是不正確的,pyc文件是可以很容易被反編譯的,比如說比較著名的uncompyle6庫(https://github.com/rocky/python-uncompyle6),用來反編譯文件最爽不過了,幾乎支持python全版本的pyc文件的反編譯。

        為什么要做代碼分析?

        一般來說,代碼分析重要性的判斷比較主觀,不同的人有不同的認(rèn)識(shí)。Python是用C來實(shí)現(xiàn)的,所以對(duì)于Python的性能或代碼質(zhì)量的評(píng)估可以通過dis模塊獲取到對(duì)應(yīng)的字節(jié)碼指令來進(jìn)行評(píng)估。

        一般來說一個(gè)Python語句會(huì)對(duì)應(yīng)若干字節(jié)碼指令,Python的字節(jié)碼是一種類似匯編指令的中間語言,但是一個(gè)字節(jié)碼指令并不是對(duì)應(yīng)一個(gè)機(jī)器指令(二進(jìn)制指令),而是對(duì)應(yīng)一段C代碼,而不同的指令的性能不同,所以不能單獨(dú)通過指令數(shù)量來判斷代碼的性能,而是要通過查看調(diào)用比較頻繁的指令的代碼來確認(rèn)一段程序的性能。

        一個(gè)Python的程序會(huì)有若干代碼塊組成,例如一個(gè)Python文件會(huì)是一個(gè)代碼塊,一個(gè)類,一個(gè)函數(shù)都是一個(gè)代碼塊,一個(gè)代碼塊會(huì)對(duì)應(yīng)一個(gè)運(yùn)行的上下文環(huán)境以及一系列的字節(jié)碼指令。

        dis模塊主要是用來分析字節(jié)碼的一個(gè)內(nèi)置模塊。dis模塊的文檔可以讓你遍歷它的內(nèi)容,并且提供一個(gè)字節(jié)碼指令能夠做什么和有什么樣的參數(shù)的完整清單。

        以上內(nèi)容為大家介紹了python之什么是字節(jié)碼(bytecode)?希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://www.2667701.com/

        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        平顶山市| 仁布县| 万全县| 通海县| 新宁县| 个旧市| 汉沽区| 和龙市| 义马市| 樟树市| 林芝县| 巨野县| 福州市| 太原市| 焦作市| 樟树市| 纳雍县| 武义县| 华坪县| 新乐市| 定州市| 墨玉县| 阜新市| 曲阜市| 齐河县| 磐安县| 青州市| 建德市| 浑源县| 济南市| 清水县| 达日县| 南召县| 东平县| 河间市| 嘉祥县| 宁化县| 通海县| 蒙城县| 赤壁市| 金堂县|