中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

利用Psyco提升Python運行速度
來源:易賢網 閱讀:1111 次 日期:2015-01-03 10:57:20
溫馨提示:易賢網小編為您整理了“利用Psyco提升Python運行速度”,方便廣大網友查閱!

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 將操作編譯成機器碼,那么編譯時變量就會在機器寄存器和可直接訪問的內存位置中表示。

最有意思的級別是虛擬時變量。在內部,一個 Python 變量就是一個有許多成員組成的完整結構 - 即使當對象只代表一個整數時也是如此。Psyco 虛擬時變量代表了需要時可能會被構建的 Python 對象,但是這些對象的詳細信息在它們成為 Python 對象之前是被忽略的。例如,考慮如下賦值:

x = 15 * (14 + (13 - (12 / 11)))

標準的 Python 會構建和破壞許多對象以計算這個值。構建一個完整的整數對象以保存 (12/11) 這個值;然后從臨時對象的結構中“拉”出一個值并用它計算新的臨時對象 (13-PyInt)。而 Psyco 跳過這些對象,只計算這些值,因為它知道“如果需要”,可以從值創建一個對象。

使用 Psyco

解釋 Psyco 相對比較困難,但是使用 Psyco 就非常容易了。基本上,其全部內容就是告訴 Psyco 模塊哪個函數/方法要“專門化”。任何 Python 函數和類本身的代碼都不需進行更改。

有幾種方法可以指定 Psyco 應該做什么。“獵槍(shotgun)”方法使得隨處都可使用 Psyco 即時操作。要做到這點,把下列行置于模塊頂端:

代碼如下:

import psyco ; psyco.jit()

from psyco.classes import *

第一行告訴 Psyco 對所有全局函數“發揮其魔力”。第二行(在 Python 2.2 及以上版本中)告訴 Psyco 對類方法執行相同的操作。為了更精確地確定 Psyco 的行為,可以使用下列命令:

psyco.bind(somefunc) # or method, class

newname = psyco.proxy(func)

第二種形式把 func 作為標準的 Python 函數,但是優化了涉及 newname 的調用。除了測試和調試之外的幾乎所有的情況下,您都將使用 psyco.bind() 形式。

Psyco 的性能

盡管 Psyco 如此神奇,使用它仍然需要一點思考和測試。主要是要明白 Psyco 對于處理多次循環的塊是很有用的,而且它知道如何優化涉及整數和浮點數的操作。對于非循環函數和其它類型對象的操作,Psyco 多半只會增加其分析和內部編譯的開銷。而且,對于含有大量函數和類的應用程序來說,在整個應用程序范圍啟用 Psyco,會在機器碼編譯和用于這一高速緩存的內存使用方面增加大量的負擔。有選擇性地綁定那些可以從 Psyco 的優化中獲得最大收益的函數,這樣會好得多。

我以十分幼稚的方式開始了我的測試過程。我僅僅考慮了我近來運行的、但還未考慮加速的應用程序。想到的第一個示例是用來將我即將出版的書稿(Text Processing in Python)轉換成 LaTeX 格式的文本操作程序。該應用程序使用了一些字符串方法、一些正則表達式和一些主要由正則表達式和字符串匹配所驅動的程序邏輯。實際上將它用作 Psyco 的測試候選是很糟的選擇,但是我還是使用了,就這么開始了。

第一遍測試中,我所做的就是將 psyco.jit() 添加到腳本頂端。這做起來一點都不費力。遺憾的是,結果(意料當中)很令人失望。原先腳本運行要花費 8.5 秒,經過 Psyco 的“加速”后它大概要運行 12 秒。真差勁!我猜測大概是即時編譯所需的啟動開銷拖累了運行時間。因此接下來我試著處理一個更大的輸入文件(由原來那個輸入文件的多個副本組成)。這次獲得了小小的成功,將運行時間從 120 秒左右減到了 110 秒。幾次運行中的加速效果比較一致,但是效果都不顯著。

本處理候選項的第二遍測試中。我只添加了 psyco.bind(main) 這一行,而不是添加一個總的 psyco.jit() 調用,因為 main() 函數確實要循環多次(但是僅利用了最少的整數運算)。這里的結果名義上要比前面好。這種方法將正常的運行時間削減了十分之幾秒,在較大的輸入版本的情況下削減了數秒鐘。但是仍然沒有引入矚目的結果發生(但也沒產生什么害處)。

為進行更恰當的 Psyco 測試,我搜尋出我在以前的文章里編寫的一些神經網絡代碼(請參閱“參考資料”)。這個“代碼識別器(code_recognizer)”應用程序可以經“訓練”用于識別不同編程語言編寫的不同 ASCII 值的可能分布情況。類似于這樣的東西可能在猜測文件類型方面(比方說丟失的網絡信息包)將很有用;但是,關于“訓練”些什么,代碼實際上完全是通用的 - 它能很容易地學會識別面孔、聲音或潮汐模式。任何情況下,“代碼識別器”都基于 Python 庫 bpnn,Psyco 4.0 分發版也包含(以修正的形式)了該庫作為測試用例。在本文中,對“代碼識別器”要重點了解它做了許多浮點運算循環并花費了很長的運行時間。這里我們已經有了一個能用于 Psyco 測試的好的候選用例。

使用了一段時間后,我建立了有關 Psyco 用法的一些詳細信息。對于這種只有少量類和函數的應用程序,使用即時綁定還是目標綁定沒有太大區別。但最佳的結果是,通過有選擇性地綁定最優化類,仍可得到幾個百分點的改進。然而,更值得注意的是要理解 Psyco 綁定的作用域,這一點很重要。

code_recognizer.py 腳本包括類似于下面的這些行:

從 bpnn 導入 NN

class NN2(NN):

# customized output methods, math core inherited

也就是說,從 Psyco 的觀點來看,有趣的事情在類 bpnn.NN 之中。把 psyco.jit() 或 psyco.bind(NN2) 添加到 code_recognizer.py 腳本中起不了什么作用。要使 Psyco 進行期望的優化,需要將 psyco.bind(NN) 添加到 code_recognizer.py 或者將 psyco.jit() 添加到 bpnn.py。與您可能假設的情況相反,即時優化不在創建實例時或方法運行時發生,而是在定義類的作用域內發生。另外,綁定派生類不會專門化其從其它地方繼承的方法。

一旦找到適當的 Psyco 綁定的細微的詳細信息,那么加速效果是相當明顯的。使用參考文章中提供的相同測試用例和訓練方法(500 個訓練模式,1000 個訓練迭代),神經網絡訓練時間從 2000 秒左右減到了 600 秒左右 - 提速了 3 倍多。將迭代次數降到 10,加速的倍數也成比例降低(但對神經網絡的識別能力無效),迭代的中間數值也會如此變化。

我發現使用兩行新代碼就能將運行時間從超過半小時減到 10 分鐘左右,效果非常顯著。這種加速仍可能比 C 編寫的類似應用程序的速度慢,而且它肯定比幾個獨立的 Psyco 測試用例所反映出的 100 倍加速要慢。但是這種應用程序是相當“真實的”,而且在許多環境中這些改進已經是夠顯著的了。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
易賢網手機網站地址:利用Psyco提升Python運行速度
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲国产一区二区三区青草影视| 国产在线观看一区| 欧美一区二区视频免费观看| 久久9热精品视频| 欧美激情一区二区三区全黄| 国产精品久久久久77777| 91久久香蕉国产日韩欧美9色 | 亚洲精品视频啊美女在线直播| 欧美一级片在线播放| 国产精品r级在线| 亚洲欧美一区二区原创| 欧美日韩一区成人| 正在播放亚洲| 国产精品视频自拍| 欧美一区2区视频在线观看| 国产精品私房写真福利视频| 日韩一级精品视频在线观看| 欧美经典一区二区| 一本一本久久| 国产精品每日更新在线播放网址| 亚洲人www| 国产亚洲一二三区| 国产精品亚洲а∨天堂免在线| 欧美美女视频| 亚洲一级网站| 日韩一区二区精品葵司在线| 亚洲欧洲一级| 99热精品在线| 久久精品av麻豆的观看方式| 狠狠久久婷婷| 欧美一区国产在线| 91久久嫩草影院一区二区| 国产精品自拍在线| 国产精品久久77777| 欧美在线观看视频| 亚洲精品中文在线| 亚洲国产精品久久| 尤物yw午夜国产精品视频| 国产日韩欧美精品| 国产精品天天看| 国产精品日韩| 国产精品久久国产三级国电话系列| 欧美ab在线视频| 欧美激情一区二区三区在线视频观看 | 欧美精品久久久久久久久久| 久久久噜噜噜久噜久久| 国产精品初高中精品久久| 亚洲综合色在线| 欧美日韩在线不卡| 亚洲伊人网站| 国产精品色在线| 亚洲视频第一页| 亚洲一区二区三区四区中文 | 欧美诱惑福利视频| 国产精品免费福利| 一区二区三区久久精品| 国产亚洲毛片| 欧美黄在线观看| 欧美日韩国产大片| 欧美日韩在线一区| 国产精品久久福利| 国产亚洲午夜| 国产欧美日韩亚洲精品| 狠色狠色综合久久| 亚洲精品一区二区三区在线观看| 99re66热这里只有精品4| 亚洲午夜精品久久| 久久精品国产亚洲aⅴ| 欧美成人免费播放| 亚洲人成在线免费观看| 久久爱www.| 欧美激情无毛| 精品动漫一区| 一区二区三区欧美激情| 另类欧美日韩国产在线| 国产欧美91| 午夜在线一区| 国产精品美女在线观看| 亚洲精品国产精品乱码不99按摩| 久久精品免费| 国外成人网址| 欧美一区二区福利在线| 欧美日韩免费观看中文| 亚洲日韩欧美视频一区| 欧美本精品男人aⅴ天堂| 国产亚洲欧洲一区高清在线观看| 一区二区三区.www| 欧美精品激情在线观看| 亚洲激情网站免费观看| 久久中文在线| 国产尤物精品| 久久日韩粉嫩一区二区三区| 国内精品久久久久影院色| 欧美在线免费观看| 精品91免费| 一区二区三区毛片| 久久久夜夜夜| 永久免费视频成人| 欧美精品成人在线| 宅男噜噜噜66一区二区| 欧美日本精品一区二区三区| 国产色爱av资源综合区| 久久精品国产久精国产思思| 国产揄拍国内精品对白| 免费日韩成人| 亚洲欧美日韩国产一区二区| 欧美日韩综合另类| 亚洲精品乱码久久久久久日本蜜臀| 欧美激情黄色片| 久久一二三区| 久久九九国产精品| 亚洲影视在线| 欧美日韩黄色大片| 美女黄毛**国产精品啪啪| 亚洲亚洲精品在线观看 | 欧美专区亚洲专区| 亚洲精品乱码久久久久久按摩观| 国产精品一区二区在线| 欧美日韩精品在线| 亚洲欧美国产不卡| 国产精品视频最多的网站| 久久欧美肥婆一二区| 亚洲女性裸体视频| 亚洲另类一区二区| 亚洲欧洲中文日韩久久av乱码| 国产一区久久久| 国产偷国产偷亚洲高清97cao| 一区二区三区在线视频观看| 99re6热只有精品免费观看| 久久电影一区| 国产精品美女主播| 羞羞答答国产精品www一本| 国产在线不卡| 欧美福利网址| 午夜电影亚洲| 国产一区二区精品丝袜| 你懂的视频欧美| 亚洲男人影院| 亚洲国产日韩欧美在线99| 欧美日韩一区二区三区在线| 午夜精品在线观看| 亚洲欧洲日本在线| 国产欧美精品久久| 欧美精品一区二区三区在线播放 | 久久激情视频免费观看| 亚洲国产综合在线看不卡| 国产精品二区影院| 免费成人黄色| 久久都是精品| 亚洲欧美日韩综合国产aⅴ| 极品少妇一区二区三区| 欧美精品七区| 麻豆久久精品| 免费久久99精品国产自在现线| 亚洲桃花岛网站| 一本色道久久综合亚洲91| 黄色另类av| 国内揄拍国内精品久久| 国产精品成人一区二区三区吃奶| 玖玖在线精品| 欧美在线不卡视频| 一本到高清视频免费精品| 在线观看日韩国产| 国模私拍一区二区三区| 国产精品成人一区二区三区吃奶| 一本色道久久99精品综合 | 亚洲精品欧美一区二区三区| 国产伦精品一区| 国产精品久久久久久亚洲调教| 欧美sm视频| 欧美国产在线电影| 欧美高清成人| 久久免费少妇高潮久久精品99| 亚洲一区欧美一区| 一本色道久久综合精品竹菊| 亚洲国产经典视频| 亚洲第一视频| 99精品99久久久久久宅男| 亚洲美女啪啪| 一区二区久久久久| 亚洲免费一在线| 老牛影视一区二区三区| 欧美日韩国产精品一区| 国产精品人人做人人爽| 国模叶桐国产精品一区| 亚洲第一主播视频| 在线日韩电影| 亚洲免费观看视频| 午夜精品999| 久久女同互慰一区二区三区| 久久婷婷国产综合国色天香| 欧美日韩国产色站一区二区三区| 欧美日一区二区在线观看| 激情五月综合色婷婷一区二区| 亚洲人成在线播放| 亚洲欧美国产不卡| 欧美日韩亚洲综合一区| 国内成人精品一区| 99国产精品| 欧美日韩一区二区在线 |