改用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運行則會報錯,須要移除

相關文章
相關標籤/搜索