改用pypy运行django项目

最近在研究socket编程,写了个echo server,试了试pypy,比用python2.7流量大了好几倍,简直吓死宝宝了。本地跑网络相关的程序基本没有拥塞,因此主要就至关于测试CPU了,感受主要是节省了线程和循环开销,多是pypy的某种优化吧python

无事时我便本身尝试将在公司的项目代码在本地改用pypy跑,毫无疑问会碰到一些困难,但这比从头开始用pypydjango项目仍是受益得多。官方号称快大概7倍(大误)mysql

首先是包的问题,日常装的包都在py2的路径下,因此直接在pypysite-packages下建一个.pth文件把py2的包拿来用。进入pypy的包文件夹git

/usr/local/Cellar/pypy/4.0.1/libexec/site-packagesgithub

新建一个文件叫external.pth,加入两行sql

/Library/Python/2.7/site-packages
/usr/local/lib/python2.7/site-packagesdjango

这样确实可使用部分用pure python写的包了,可是有些用clang写的就不行了,好比MySQLdb(mysql-python),谷歌了一下,答案千奇百怪,看的官方说是1.2.4c1及以上能够运行。可是项目就是跑不起来,一直报import _mysql的错误,说是无此包。查看发现该库只有_mysql.so文件。
对比着看,若是用py2的话,PyCharm会由_mysql.so生成一个_mysql.py做为缓存,而后就可使用MySQLdb了,可是用pypy跑的时候生成该文件失败。PyCharm中在Binary Skeletons下有一个.blacklist的文件记录有解析失败的.so文件编程

我把由PyCharm生成的_mysql.py文件复制一份到py2下的MySQLdb包里,让pypy直接使用它,这样此处就再也不报错了,可是其它用了clang的仍是报错,这样复制不是办法。继续在网上研究解决方法,而后发现这种用了C语言带.so文件的包不能用拿来主义,一般要经过CFFI的接口来调用(有些包能够直接用),普通C语言写的没有这种接口固然是不行的。另外,用ctypes写的是兼容Cpython和PyPy的缓存

所以安装给pypy用的包最好用其本身的方式,和cpython差很少网络

  • pip_pypypython2.7

  • easy_install_pypy

  • pypy setup.py intall

这样一个个地装包,不过有的仍是有问题,好比Crypto,py2装的包是Crypto,可是pypy装的包是crypto,但里面文件import的时候仍是用的Crypto,大小写不对。
装完须要的包以后,运行实测,选择一个比较复杂的网页,加载时间由接近1.9s减小到1s内,确实有很是明显地提升

后来还发现一个问题,在上述过程当中把由PyCharm生成的_mysql.py放到了py2的MySQLdb下,可让pypy运行,但再让py2运行则会报错,须要移除

相关文章
相关标签/搜索