最近在研究socket編程,寫了個echo server,試了試pypy
,比用python2.7
流量大了好幾倍,簡直嚇死寶寶了。本地跑網絡相關的程序基本沒有擁塞,因此主要就至關於測試CPU了,感受主要是節省了線程和循環開銷,多是pypy
的某種優化吧python
無事時我便本身嘗試將在公司的項目代碼在本地改用pypy
跑,毫無疑問會碰到一些困難,但這比從頭開始用pypy
跑django
項目仍是受益得多。官方號稱快大概7倍(大誤)mysql
首先是包的問題,日常裝的包都在py2的路徑下,因此直接在pypy
的site-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運行則會報錯,須要移除