This is a quick guide to running your [python/django] project on PyPy, the fast JIT-based Python interpreter (and optionally benchmark re: cPython)
Install PyPy
Follow the clearly detailed instructions in: http://pypy.readthedocs.org
For example, for 32-bit linux I used:
$ wget https://bitbucket.org/pypy/pypy/downloads/pypy-1.8-linux.tar.bz2 $ tar xvf pypy-1.8-linux.tar.bz2
This will create a folder named pypy-1.8
, which matches Python 2.7.2:
$ ./pypy-1.8/bin/pypy --version Python 2.7.2 (0e28b379d8b3, Feb 09 2012, 19:41:19) [PyPy 1.8.0 with GCC 4.4.3]
Create your virtual environment
Install distribute and pip for pypy:
NOTE: These instructions no longer work.
http://python-distribute.org is a domain for sale.
$ # wget http://python-distribute.org/distribute_setup.py ## OBSOLETE $ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py $ ./pypy-1.8/bin/pypy distribute_setup.py $ ./pypy-1.8/bin/pypy get-pip.py
Make sure you have at least virtualenv 1.6, else it won’t work with PyPy:
$ virtualenv --version 1.6.4
Install virtualenvwrapper, and create a new virtual environment for your projectx:
$ ./pypy-1.8/bin/pip install virtualenvwrapper $ mkvirtualenv --no-site-packages --distribute --python=/path/to/pypy-1.8/bin/pypy projectx-pypy $ python --version Python 2.7.2 (0e28b379d8b3, Feb 09 2012, 19:41:19) [PyPy 1.8.0 with GCC 4.4.3]
Now we have a virtual environment named projectx-pypy
based on pypy
that we can use as just any other virtualenv.
Setup your project
Install your project’s requirements as usual:
$ workon projectx-pypy $ pip install -r requirements.txt -r test-requirements.txt
Benchmark if desired
Now I can easily compare timings between cPython and PyPy. I created another identical virtualenv based on cPython (2.7.2) and run the same tests (one testcase replicated 100000 times using nose test generators, just to have something time consuming and CPU-intensive).
PyPy:
$ workon projectx-pypy $ nosetests ... ---------------------------------------------------------------------- Ran 100000 tests in 8.624s
cPython:
$ workon projectx $ nosetests ... ---------------------------------------------------------------------- Ran 100000 tests in 38.180s
Of course this is not a representative sample, but just a simple test. In this one case, PyPy takes approximately 20% the execution time of cPython. Not bad, huh?
The PyPy people have more comprehensive benchmarks in their speed center.
So give PyPy a try, and share your results.