『壹』 關於python里的操作
我轉載下網上說的比較明白的文章內容吧:
個人理解部分:總的來說python中所有變數都是保存引用地址的,不是直接保存值。然後
a,b=b,a這條代碼對應python解釋器解析後的是多條機器指令,它的執行順序是先將右邊的b,a的變數引用地址bb,aa載入出來,然後分別a指向bb,b指向aa,這樣就完成了值的交換,
而不能簡單的理解成先執行b=a,再執行a=b,兩者是不同的
以下是轉載截取:
Python的變數並不直接存儲值,而只是引用一個內存地址,交換變數時,只是交換了引用的地址。
先看下面這段程序:
importdis
deffunc(a,b):
a,b=b,a
print(a,b)
a=10
b=20
func(a,b)
dis.dis(func)
一般來說一個Python語句會對應若干位元組碼指令,Python的位元組碼是一種類似匯編指令的中間語言,但是一個位元組碼指令並不是對應一個機器指 令(二進制指令),而是對應一段C代碼,而不同的指令的性能不同,所以不能單獨通過指令數量來判斷代碼的性能,而是要通過查看調用比較頻繁的指令的代碼來 確認一段程序的性能。
一個Python的程序會有若干代碼塊組成,例如一個Python文件會是一個代碼塊,一個類,一個函數都是一個代碼塊,一個代碼塊會對應一個運行的上下文環境以及一系列的位元組碼指令。
dis的作用
dis模塊主要是用來分析位元組碼的一個內置模塊,經常會用到的方法是dis.dis([bytesource]),參數為一個代碼塊,可以得到這個代碼塊對應的位元組碼指令序列。
代碼輸出結果
其中只看前面為12的結果就行了(在我的編譯器里,交換的那一行代碼在第12行)
可以看出主要是ROT_TWO指令的功勞:
查閱python文檔可以知道有ROT_TWO (源碼1398行),ROT_THREE(源碼1406行), ROT_FOUR這樣的指令,可以直接交換兩個變數、三個變數、四個變數的值
---------------------
作者:土豆洋芋山葯蛋
來源:CSDN
原文:https://blog.csdn.net/qq_33414271/article/details/78522235
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
『貳』 python解釋器
python解釋器的介紹:
解釋器由一個編譯器和一個虛擬機構成,編譯器負責將源代碼轉換成位元組碼文件,而虛擬機負責執行位元組碼。
所以,解釋型語言其實也有編譯過程,只不過這個編譯過程並不是直接生成目標代碼,而是中間代碼(位元組碼),然後再通過虛擬機來逐行解釋執行位元組碼。
計算機的大腦是CPU, 中文名叫中央處理器,它仍然不能直接處理 Python 語言。CPU 只能直接處理機器指令語言,那是一種由0和1數字組成的語言,這是一種我們人很難直接寫出來的語言。
所以,我們需要一個翻譯,把Python語言翻譯成 計算機CPU 能聽懂的機器指令語言,這樣計算機才能按照 我們的Python程序的要求去做事。.py結尾的文件需要解釋器去運行執行。
執行過程原理:
1.執行 python XX.py 後,將會啟動 Python 的解釋器。
2.python解釋器的編譯器會將.py源文件編譯(解釋)成位元組碼生成PyCodeObject位元組碼對象存放在內存中。
3.python解釋器的虛擬機將執行內存中的位元組碼對象轉化為機器語言,虛擬機與操作系統交互,使機器語言在機器硬體上運行。
4.運行結束後python解釋器則將PyCodeObject寫回到pyc文件中。當python程序第二次運行時,首先程序會在硬碟中尋找pyc文件,如果找到,則直接載入,否則就重復上面的過程。
Python解釋器執行程序的三個階段:
第一步:先啟動python3解釋器。
第二步:Python3解釋器就像一個文本編輯器一樣將文件python3 D: est.py從硬碟讀入內存。
第三步:Python3解釋器解釋執行文件代碼。
只有第三階段才識別python的語法。
『叄』 python windows系統 源代碼
一、python如何運行程序
首先說一下python解釋器,它是一種讓其他程序運行起來的程序。當你編寫了一段python程序,python解釋器將讀取程序,並按照其中的命令執行,得出結果,實際上,解釋器是代碼與機器的計算機硬體之間的軟體邏輯層。
通俗來說,我們的計算機是基於二進制進行運算的,無論你用什麼語言來寫程序,無論你的程序寫的多麼簡單或多麼復雜,最終交給計算機運行的一定是0或1,因為計算機只能識別0和1。
我們目前使用的大多數編程語言都是高級程序語言,也就是利於我們人類閱讀的語言,要使我們編寫的程序能夠在計算機上跑起來,要經過一定的轉換才可以,python程序大致的過程應該是這樣:
源代碼-->位元組碼-->pvm(虛擬機)-->機器碼
可以到Python的官方網站下載python(http://www.python.org),通常包括解釋器、庫文件及簡單的編碼環境(IDLE)。把源代碼編譯成位元組碼其實是為了程序更節省時間,如果源代碼沒有變動,那麼運行程序時會直接從位元組碼讀取,加快速度,把位元組碼放到虛擬機去解釋,可以更好的跨平台運行,最後轉換成機器碼。
二、Windows系統下搭建python編程環境。
1、進入Python官網http://www.python.org,在「Downloads」下拉菜單中選擇相應的操作系統,我們選擇windows。
最後選擇菜單中的Run下的run mole即可運行,快捷鍵為F5。
『肆』 ue5python原理
Python先把代碼(.py文件)編譯成位元組碼,交給位元組碼虛擬機,然後解釋器一條一條執行位元組碼指令,從而完成程序的執行。
1.1python先把代碼(.py文件)編譯成位元組碼,交給位元組碼虛擬機,然後解釋器會從編譯得到的PyCodeObject對象中一條一條執行位元組碼指令,
並在當前的上下文環境中執行這條位元組碼指令,從而完成程序的執行。Python解釋器實際上是在模擬操作中執行文件的過程。PyCodeObject對象
中包含了位元組碼指令以及程序的所有靜態信息,但沒有包含程序運行時的動態信息——執行環境(PyFrameObject)
2. 位元組碼
位元組碼在python解釋器程序里對應的是PyCodeObject對象
.pyc文件是位元組碼在磁碟上的表現形式
2.1從整體上看:OS中執行程序離不開兩個概念:進程和線程。python中模擬了這兩個概念,模擬進程和線程的分別是PyInterpreterState和
PyTreadState。即:每個PyThreadState都對應著一個幀棧,python解釋器在多個線程上切換。當python解釋器開始執行時,它會先進行一
些初始化操作,最後進入PyEval_EvalFramEx函數,它的作用是不斷讀取編譯好的位元組碼,並一條一條執行,類似CPU執行指令的過程。函數內部
主要是一個switch結構,根據位元組碼的不同執行不同的代碼。
3. .pyc文件
PyCodeObject對象的創建時機是模塊載入的時候,及import
Python test.py會對test.py進行編譯成位元組碼並解釋執行,但是不會生成test.pyc
如果test.py載入了其他模塊,如import urlib2, Python會對urlib2.py進行編譯成位元組碼,生成urlib2.pyc,然後對位元組碼進行解釋
如果想生成test.pyc,我們可以使用Python內置模塊py_compile來編譯。
載入模塊時,如果同時存在.py和pyc,Python會嘗試使用.pyc,如果.pyc的編譯時間早於.py的修改時間,則重新編譯.py並更新.pyc。
4. PyCodeObject
Python代碼的編譯結果就是PyCodeObject對象
typedef struct {
PyObject_HEAD
int co_argcount; /* 位置參數個數 */
int co_nlocals; /* 局部變數個數 */
int co_stacksize; /* 棧大小 */
int co_flags;
PyObject *co_code; /* 位元組碼指令序列 */
PyObject *co_consts; /* 所有常量集合 */
PyObject *co_names; /* 所有符號名稱集合 */
PyObject *co_varnames; /* 局部變數名稱集合 */
PyObject *co_freevars; /* 閉包用的的變數名集合 */
PyObject *co_cellvars; /* 內部嵌套函數引用的變數名集合 */
/* The rest doesn』t count for hash/cmp */
PyObject *co_filename; /* 代碼所在文件名 */
PyObject *co_name; /* 模塊名|函數名|類名 */
int co_firstlineno; /* 代碼塊在文件中的起始行號 */
PyObject *co_lnotab; /* 位元組碼指令和行號的對應關系 */
void *co_zombieframe; /* for optimization only (see frameobject.c) */
} PyCodeObject;
5. .pyc文件格式
載入模塊時,模塊對應的PyCodeObject對象被寫入.pyc文件
6.分析位元組碼
6.1解析PyCodeObject
Python提供了內置函數compile可以編譯python代碼和查看PyCodeObject對象
6.2指令序列co_code的格式
opcode oparg opcode opcode oparg …
1 byte 2 bytes 1 byte 1 byte 2 bytes
Python內置的dis模塊可以解析co_code
7. 執行位元組碼
Python解釋器的原理就是模擬可執行程序再X86機器上的運行,X86的運行時棧幀如下圖
Python解釋器的原理就是模擬上述行為。當發生函數調用時,創建新的棧幀,對應Python的實現就是PyFrameObject對象。
PyFrameObject對象創建程序運行時的動態信息,即執行環境
7.1 PyFrameObject
typedef struct _frame{
PyObject_VAR_HEAD //"運行時棧"的大小是不確定的
struct _frame *f_back; //執行環境鏈上的前一個frame,很多個PyFrameObject連接起來形成執行環境鏈表
PyCodeObject *f_code; //PyCodeObject 對象,這個frame就是這個PyCodeObject對象的上下文環境
PyObject *f_builtins; //builtin名字空間
PyObject *f_globals; //global名字空間
PyObject *f_locals; //local名字空間
PyObject **f_valuestack; //"運行時棧"的棧底位置
PyObject **f_stacktop; //"運行時棧"的棧頂位置
//...
int f_lasti; //上一條位元組碼指令在f_code中的偏移位置
int f_lineno; //當前位元組碼對應的源代碼行
//...
//動態內存,維護(局部變數+cell對象集合+free對象集合+運行時棧)所需要的空間
PyObject *f_localsplus[1];
} PyFrameObject;
每一個 PyFrameObject對象都維護了一個 PyCodeObject對象,這表明每一個 PyFrameObject中的動態內存空間對象都和源代碼中的一段Code相對應。