python虛擬機直接加載字節碼運行程序_第二章 python如何運行程序

一.python解釋器介紹

Python解釋器是一種讓程序運行起來的程序。實際上,解釋器是代碼與機器的計算機硬件之間的軟件邏輯層。

當Python包安裝在機器上后,它包含了一些最小化的組件:一個解釋器和支持的庫。

二.python的視角

當Python運行腳本時,第一步是把代碼編譯成“字節碼”,之后將其轉發到所謂的“虛擬機”中。

1.第一步:字節碼編譯

當程序執行時,Python內部會先將源代碼(文件中的語句)編譯成所謂字節碼的形式。編譯是一個簡單的翻譯步驟,而且字節碼是源代碼底層的、與平臺無關的表現形式。概括地說,Python通過把每一條源語句分解為單一步驟來將這些源語句翻譯成一組字節碼指令。這些字節碼可以提高執行速度。

即,把后綴名為.pyc的文件-->后綴名為.py的文件。

Python這樣保存字節碼是作為一種啟動速度的優化。下一次運行程序時,如果你在上次保存字節碼之后沒有修改過源代碼的話,Python將會加載.pyc文件并跳過編譯這個步驟。

2.第二步:python虛擬機(pvm)

一旦程序編譯成字節碼(或字節碼從已經存在的.pyc文件中載入),之后的字節碼發送到通常稱為Python虛擬機(Python Virtual Machine,簡寫為PVM)上來執行。從技術上講,它才是所謂“Python解釋器”的最后一步。

3.性能的含義

在Python的工作中通常沒有“build”或“make”的步驟:代碼在寫好之后立即運行。另外一個就是,Python字節碼不是機器的二進制代碼(例如,Intel芯片的指令)。字節碼是特定于Python的一種表現形式。

這就是Python代碼無法運行得像C或C++代碼一樣快的原因。

從更基礎的角度來說,牢記我們在Python中真正擁有的只有運行時:完全不需要初始的編譯階段,所有的事情都是在程序運行時發生的。這甚至還包括了建立函數和類的操作以及連接的模塊。這些事情對于靜態語言往往是發生在執行之前的,而在Python中是與程序的執行同時進行的。就像我們看到的那樣,實際的效果就是Python比一些讀者所用的程序語言帶來了更加動態的編程體驗。

4.CPython

原始的、標準的Python實現方式通常稱作CPython。圖2-2反映了CPython的運行體系結構。

5.Jython

Jython包含了Java類,這些類編譯Python源代碼、形成Java字節碼,并將得到的字節碼映射到Java虛擬機(JVM)上。程序員仍然可以像平常一樣,在文本文件中編寫Python語句;Jython系統的本質是將圖2-2中的最右邊兩個方框中的內容替換為基于Java的等效實現。

6.IroPython

它替換了圖2-2中最后的兩個方框,將其換成.NET環境的等效執行方式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541555.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541555.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java LocalDate類| 帶示例的format()方法

LocalDate類format()方法 (LocalDate Class format() method) format() method is available in java.time package. format()方法在java.time包中可用。 format() method is used to format this LocalDate object by using the given DateTimeFormatter object. format()方法…

胃癌2019csco指南_2019 CSCO胃癌診療指南精華來了!

一文輕松get 2019 CSCO胃癌診療指南更新要點!文丨青青子衿 中山大學腫瘤防治中心來源丨醫學界腫瘤頻道近日,2019年CSCO指南發布會于南京召開。今天為大家推送的是2019 CSCO胃癌診療指南的最新更新,在發布專場中,來自華中科技大學同…

001_docker-compose構建elk環境

由于打算給同事分享elk相關的東西,搭建配置elk環境太麻煩了,于是想到了docker。docker官方提供了docker-compose編排工具,elk集群一鍵就可以搞定,真是興奮。好了下面咱們開始吧。 一、 https://github.com/deviantony/docker-elk $ cd /006_xxxallproject/005_docker/001_e…

Java即時類| toString()方法與示例

即時類toString()方法 (Instant Class toString() method) toString() method is available in java.time package. toString()方法在java.time包中可用。 toString() method is used to represent this Instant as a String by using the standards ISO-8601 format. toString…

learn opengl 中文_LearnOpenGL CN

歡迎來到OpenGL的世界歡迎來到OpenGL的世界。這個工程只是我(Joey de Vries)的一次小小的嘗試,希望能夠建立起一個完善的OpenGL教學平臺。無論你學習OpenGL是為了學業,找工作,或僅僅是因為興趣,這個網站都將能夠教會你現代(Core-p…

MYSQL5.7 日志管理

2019獨角獸企業重金招聘Python工程師標準>>> 慢查詢日志slow-query-log1 slow-query-log-filefile_name long_query_time1 #SQL執行多長時間以上會記錄到慢查詢日志,0~10s log_slow_admin_statementsOFF #在寫入慢查詢日志的語句中包含緩慢的管理語句。 …

duration java_Java Duration類| ofHours()方法與示例

duration javaDuration Class of Hours()方法 (Duration Class ofHours() method) ofHours() method is available in java.time package. ofHours()方法在java.time包中可用。 ofHours() method is used to represent the given hours in this Duration. ofHours()方法用于表示…

sumo的簡單應用_sumo快速運行簡單仿真實例詳細教程

本文旨在讓大家快速的了解sumo,并給出運行一個簡單的sumo的例子的教程,進而了解基本sumo工程的架構,使大家對該軟件產生興趣并持續學習下去,剛開始學習仿真的確枯燥,項目“跑起來”才是大家學習下去的動力,…

stl vector 函數_vector :: crbegin()函數,以及C ++ STL中的示例

stl vector 函數C vector :: crbegin()函數 (C vector::crbegin() function) vector::crbegin() is a library function of "vector" header, it is used to get the last element of a vector using const_reverse_iterator, it returns a const reverse iterator …

ReactNative學習筆記(二)Flex布局

flexDirection 決定主軸方向 column:垂直方向為主軸row:水平方向為主軸justifyContent 決定主軸元素排列方式 flex-startflex-endcenterspace-betweenspace-aroundalignItems 決定側軸元素排列方向 flex-startflex-endcenterbaselinestretch

cad導出 dxf后中文不顯示_CAD快速看圖 for Mac

CAD快速看圖 for Mac是一款非常小巧、快速、方便的DWG看圖工具,CAD快速看圖 Mac版可脫離AutoCAD最快速、最方便瀏覽DWG和DXF圖紙,支持二維或三維圖紙,支持高清、多文件和云字體,非常實用的一款CAD看圖軟件,CAD快速看圖…

scala運算符_Scala的所有符號運算符是什么意思?

scala運算符Scala的符號運算符 (Scalas symbolic operators) The symbolic operators in Scala are symbols that have a specific task that they perform when called in a Scala program. Scala library defines a lot of symbols that can be used while programming in Sc…

關于java.util.ConcurrentModificationException和remove倒數第二個元素

2019獨角獸企業重金招聘Python工程師標準>>> 首先是兩段代碼的執行結果&#xff1a; 代碼一&#xff1a; public class TestListRemove {public static void main(String[] args) {List<Integer> list new ArrayList<Integer>();list.add(1);list.add(…

linux 操作mysql 數據庫命令_Linux 操作數據庫命令

一、連接數據庫格式&#xff1a; mysql -h主機地址 -u用戶名 &#xff0d;p用戶密碼mysql -hlocalhost -uroot -p123注&#xff1a;-h,-u,-p 后面不加空格&#xff0c;進入數據庫操作后每個命令結尾都需加“&#xff1b;(分號)”二、退出MYSQL命令exit (回車)三、顯示所有數據庫…

fragment和Activity同時操作UI引起的延遲、卡頓

最近項目中遇到一個問題&#xff0c;app首頁的Activity中由若干個Fragment頁面組成&#xff0c;其中一個fragment頁面是由一個GridView和ListView組成的列表&#xff0c;如果列表中數據量過大的時候&#xff0c;在請求數據的時候點擊頁面上的其他按鈕會無響應&#xff0c;直到該…

怎么刪除mysql的壓縮包_壓縮包版mysql怎么卸載

MySQL是一個小巧玲瓏但功能強大的數據庫&#xff0c;目前十分流行。但是官網給出的安裝包有兩種格式&#xff0c;一個是msi格式&#xff0c;一個是zip格式的。那么壓縮版mysql要怎么卸載&#xff1f;下面本篇文章就來大家介紹一下&#xff0c;希望對你們有所幫助。卸載壓縮包版…

obj.val 非數組_在Ruby中使用Array.new(size,obj)創建數組

obj.val 非數組In the previous article, we have learnt how we can declare an Array class instance with the help of Array.[](*args) method? You can also notice that in the program codes written to demonstrate all those methods are having Array instances dec…

julia在mac環境變量_在Julia中找到值/變量的類型

julia在mac環境變量To find the type of a variable/value, we use the typeof() function – it accepts a parameter whose type to be found and returns its data type. 為了找到變量/值的類型&#xff0c;我們使用typeof()函數-它接受要查找其類型的參數并返回其數據類型。…

lambda表達式之進化

前言在C#我們可以自定義委托&#xff0c;但是C#為什么還要內置泛型委托呢&#xff1f;因為我們常常要使用委托&#xff0c;如果系統內置了一些你可能會用到的委托&#xff0c;那么就省去了定義委托&#xff0c;然后實例化委托的步驟&#xff0c;這樣一來既使代碼看起來簡潔而干…

mysql返回行數_如何計算MySQL查詢返回的行數?

How can I count the number of rows that a MySQL query returned?解決方案Getting total rows in a query result...You could just iterate the result and count them. You dont say what language or client library you are using, but the API does provide a mysql_nu…