利用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


104452744.jpg


简单的跑一下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import  time
#xiaorui.cc
#rfyiamcool@ 163 .com
def test(n,m):
     m=m
     vals = []
     keys = []
     for  in  xrange(m):
         vals.append(i)
         keys.append( 'a%s' %i)
     d = None
     for  in  xrange(n):
         d = dict(zip(keys, vals))
     return  d
if  __name__ ==  '__main__' :
     st = time.time()
     print test( 1000000 , 100 )
     print  'use:' , time.time() - st


看看pypy和纯python执行的效率比较 !

发现一个小规律,在小数据的时候,貌似pypy比率很大,但是运算多了后,貌似结果差距不算大。

111647847.jpg

这是用纯python执行的结果。

111741475.jpg


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import  time
from time  import  clock
#xiaorui.cc
def check(num):
     a = list(str(num))
     b = a[::- 1 ]
     if  a == b:
         return  True
     return  False
                                                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                       
def main():
     all = range( 1 , 10 ** 7 )
     for  in  all:
         if  check(i):
             if  check(i** 2 ):
                 print(i,i** 2 )
                                                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                       
if  __name__ ==  '__main__' :
     start = clock()
     main()
     end = clock()
     print (end-start)


112502665.jpg

结果打出来是这样的 ~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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的主频有关联的 !

114342262.png


有老外说 gevent和pypy可以更好的提高效率,在pypy层次下也可以调用协程。等有结果在分享给大家!

pypy对我来说,最大的缺点就是他的库支持的还是少,尤其是socket级别的包,不少的bug。  就算是最广泛的Django也是存在兼容的 !  


1
2
3
4
5
6
7
root@YZSJHL1- 131 :~$pypy myapp.py
Traceback (most recent call last):
   File  "app_main.py" , line  72 in  run_toplevel
   File  "myapp.py" , line  2 in  <module>
     from flask  import  Flask
ImportError: No module named flask
root@YZSJHL1- 131 :~





 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1343917,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值