22 利用 pypy 提高 python 腳本的執行速度及測試性能

啥是 pypy

簡單地說, PyPy 是用 Python 語言寫了一個工具, 將 Python 代碼成 C, .NET, Java 等語言和平台的代碼. PHP 也有類似的項目 – HipHop-PHP, 把 PHP 代碼轉成 C++ 代碼.

為什麼要將一種語言轉成另一種語言? 首先是目標語言可能在性能(如 C 語言)和/或跨平台(如 .NET, Java)等方面具有優勢. 其次, 在轉換的過程, 可以進行代碼優化或加入新技術, 比如 PyPy 應用的 Just-in-Time(JIT) 技術, 能讓 Python (事實上是轉換後的目標代碼)的執行速度更快.

反正是性能很好的東西,但是也有不少的局限性。

咱們就不用源碼安裝了,最新的版本是 2.2.1,但是看老外那邊用 2.0 的還是比較的多。 有需要的朋友可以下載 2.2.1

地址:http://pypy.org/download.html

圖片 22.1 pic

簡單的跑一下:

import time #xiaorui.cc #[email protected] test(n,m):    m=m    vals =     keys =     for i in xrange(m):vals.append(i)keys.append('a%s'%i)    d = None    for i in xrange(n):d = dict(zip(keys, vals))    return dif __name__ == '__main__':    st = time.time    print test(1000000,100)    print 'use:', time.time - st  

看看 pypy 和純 python 執行的效率比較!

發現一個小規律,在小數據的時候,貌似 pypy 比率很大,但是運算多了後,貌似結果差距不算大。

圖片 22.2 pic

這是用純 python 執行的結果。

圖片 22.3 pic

import timefrom time import clock #xiaorui.ccdef check(num):    a = list(str(num))    b = a[::-1]    if a == b:return True    return Falsedef main:    all = range(1,10**7)    for i in all:if check(i):    if check(i**2):print(i,i**2)if __name__ == '__main__':    start = clock    main    end = clock    print (end-start)  

圖片 22.4 pic

結果打出來是這樣的 ~

root@YZSJHL1-131:~$python g2.py(1, 1)(2, 4)(3, 9)(11, 121)(22, 484)(101, 10201)(111, 12321)(121, 14641)(202, 40804)(212, 44944)(1001, 1002001)(1111, 1234321)(2002, 4008004)(10001, 100020001)(10101, 102030201)(10201, 104060401)(11011, 121242121)(11111, 123454321)(11211, 125686521)(20002, 400080004)(20102, 404090404)(100001, 10000200001)(101101, 10221412201)(110011, 12102420121)(111111, 12345654321)(200002, 40000800004)(1000001, 1000002000001)(1001001, 1002003002001)(1002001, 1004006004001)(1010101, 1020304030201)(1011101, 1022325232201)(1012101, 1024348434201)(1100011, 1210024200121)(1101011, 1212225222121)(1102011, 1214428244121)(1110111, 1232346432321)(1111111, 1234567654321)(2000002, 4000008000004)(2001002, 4004009004004)  

不知道是不是服務器的性能不夠高,找了台所謂高性能的服務器再跑跑: (公司剛買了一堆的華為服務器,挺好奇的,華為居然也出服務器了,找了台沒上線的服務器測試下)

我暈,真垃圾的呀!看來這個機型適合做雜七雜八的業務的機型 !

python 的因為是單核跑的,所以和 cpu 的主頻有關聯的!

圖片 22.5 pic

有老外說 gevent 和 pypy 可以更好的提高效率,在 pypy 層次下也可以調用協程。等有結果在分享給大家!

pypy 對我來說,最大的缺點就是他的庫支持的還是少,尤其是 socket 級別的包,不少的 bug。 就算是最廣泛的 Django 也是存在兼容的!

root@YZSJHL1-131:~$pypy myapp.pyTraceback (most recent call last):  File "app_main.py", line 72, in run_toplevel  File "myapp.py", line 2, in <module>    from flask import FlaskImportError: No module named flaskroot@YZSJHL1-131:~$  

好,先說到這裡 !

本文出自 「峰雲,就她了。」 博客,謝絕轉載!

《Python實戰-從菜鳥到大牛的進階之路》