2009年8月4日 星期二

psyco python加速模組


#Download From:
#python 2.6 win32
# http://www.voidspace.org.uk/python/modules.shtml#psyco
#
#python 2.5 win32
# http://sourceforge.net/projects/psyco/files/
#
# psyco is a python accelerator which speeds up pysync by 33%

#說明網頁
#http://psyco.sourceforge.net/psycoguide/node8.html

#For larger applications, try:
import psyco
psyco.profile()

#------
try:
import psyco
psyco.profile()
except:
pass

#other import
from xxxx import *
import xxx,xxxx

#------
if __name__ == '__main__':
# Import Psyco if available
try:
import psyco
psyco.full()
except ImportError:
pass
# ...your code here...

#------
psyco.full()#對所有函數用psyco進行編譯
psyco.bind(myfunction1)#對選擇的函數用psyco進行編譯

g = psyco.proxy(f) #對函數 f用psyco進行編譯
g(args) #Psyco-accelerated call #編譯後 g函數速度會有提升
f(args) #regular slow call #f函數保持原來的調用速度

psyco.log # 用來紀錄log #Enable logging to a file named xxx.log-psyco by default, where xxx is the name of the

psyco.profile() # 可用來替代 psyco.full()

#------
轉貼:: http://www.cnpython.org/docs/300/p_240.html

使用時,在需要做效率優化的源文件前面加入以下兩句就一切OK了
import psyco
psyco.full()

psyco.profile()可以對大程序進行適當分析,以確定哪些函數最值得編譯。
psyco.log()函數用來記錄profile()得到的信息,下次就可以運行就能更快一點。
psyco.bind(myfunc)指定對函數myfunc進行編譯,可以做到比full()更精細的控制。
psyco.proxy(f)創建一個新的函數,它的代碼是由f編譯得到二進制碼。

import math, timeit, psyco

def TestA():
res, loopcnt = 0.0, 100
for i in range(loopcnt):
for j in range(loopcnt):
for k in range(loopcnt):
res = res + math.sin(i+j+k) # loopcnt^3 times

if __name__=='__main__':
TestB = psyco.proxy(TestA)
ta = timeit.Timer("TestA()", "from __main__ import TestA")
tb = timeit.Timer("TestB()", "from __main__ import TestB")
print("TestA(): %.2fs" % (ta.timeit(10)))
print("TestB(): %.2fs" % (tb.timeit(10)))

運行結果如下:
$ python test.py
TestA(): 15.84s
TestB(): 1.82s

很明顯,使用Psyco處理過的函數執行速度快了大約7~8倍,比Psyco作者宣稱的平均加速4倍的倍率更大些。
Psyco的工作原理類似JIT,只不過是on-the-fly的,對用戶而言基本透明。Psyco的主要缺點是耗費內存資源較多,在我看來不是什麼大問題,也許做網絡服務和企業應用的人才需要考慮這些吧。

沒有留言: