国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

利用Psyco提升Python運行速度

2020-02-23 06:16:42
字體:
來源:轉載
供稿:網友

Psyco 是嚴格地在 Python 運行時進行操作的。也就是說,Python 源代碼是通過 python 命令編譯成字節碼的,所用的方式和以前完全相同(除了為調用 Psyco 而添加的幾個 import 語句和函數調用)。但是當 Python 解釋器運行應用程序時,Psyco 會不時地檢查,看是否能用一些專門的機器代碼去替換常規的 Python 字節碼操作。這種專門的編譯和 Java 即時編譯器所進行的操作非常類似(一般地說,至少是這樣),并且是特定于體系結構的。到現在為止,Psyco 只可用于 i386 CPU 體系結構。Psyco 的妙處在于可以使用您一直在編寫的 Python 代碼(完全一樣!),卻可以讓它運行得更快。

Psyco 是如何工作的

要完全理解 Psyco,您可能需要很好地掌握 Python 解釋器的 eval_frame() 函數和 i386 匯編語言。遺憾的是,我自己不能對其中任何一項發表專家性的意見 - 但是我想我可以大致不差地概述 Psyco。
在常規的 Python 中,eval_frame() 函數是 Python 解釋器的內循環。eval_frame() 函數主要察看執行上下文中的當前字節碼,并將控制向外切換到一個適合實現該字節碼的函數。支持函數將做什么的具體細節通常取決于保存在內存中的各種 Python 對象的狀態。簡單點說,添加 Python 對象“2”和“3”和添加對象“5”和“6”會產生不同的結果,但是這兩個操作都以類似的方式分派。
Psyco 用復合求值單元替代 eval_frame() 函數。Psyco 有幾種方法可以用來改進 Python 所進行的操作。首先,Psyco 將操作編譯成有點優化的機器碼;由于機器碼需要完成的工作和 Python 的分派函數所要做的事一樣,所以其本身只有些許改進。而且,Psyco 編譯中的“專門的”內容不僅僅是對 Python 字節碼的選擇,Psyco 也要對執行上下文中已知的變量值進行專門化。例如,在類似于下面的代碼中,變量 x 在循環持續時間內是可知的:

代碼如下:
x = 5
l = []
for i in range(1000):
l.append(x*i)

該段代碼的優化版本不需要用“x 變量/對象的內容”乘每個 i,與之相比,簡單地用 5 乘以每個 i 所用的開銷較少,省略了查找/間接引用這一步。
除為小型操作創建特定于 i386 的代碼之外,Psyco 還高速緩存這個已編譯的機器碼以備今后重用。如果 Psyco 能夠識別出特定的操作和早先所執行的(“專門化的”)操作一樣,那么,它就能依靠這個高速緩存的代碼而不需要再次編譯代碼段。這樣就節省了一些時間。
但是,Psyco 中真正省時的原因在于 Psyco 將操作分成三個不同的級別。對于 Psyco,有“運行時”、“編譯時”和“虛擬時”變量。Psyco 根據需要提高和降低變量的級別。運行時變量只是常規 Python 解釋器處理的原始字節碼和對象結構。一旦 Psyco 將操作編譯成機器碼,那么編譯時變量就會在機器寄存器和可直接訪問的內存位置中表示。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永丰县| 岐山县| 永平县| 卢湾区| 宣化县| 高州市| 福建省| 深圳市| 桑日县| 满洲里市| 汝城县| 曲松县| 津市市| 崇州市| 长顺县| 枣庄市| 汾西县| 富宁县| 阿鲁科尔沁旗| 乌兰察布市| 通许县| 贵溪市| 金川县| 孝感市| 于田县| 二连浩特市| 安义县| 咸宁市| 上虞市| 塔河县| 乌兰察布市| 汤阴县| 屏东县| 万源市| 饶平县| 台东县| 渭源县| 海安县| 泉州市| 江都市| 宁城县|