[pypy-dev] Playing with PyPy and Django

Maciej Fijalkowski fijall at gmail.com
Sun Feb 8 11:17:44 CET 2015


Hi Tin

I have a bit sad news for you, but essentially from what I looked at
profling, the answer seems to be "don't use django, it has not been
written with performance in mind". For example here (which features in
django admin quite prominently, some stuff calls lazy() at each call):
https://github.com/django/django/blob/master/django/utils/functional.py#L48

What does it, per call that pypy does not like:

* redefines classes

* walks the class __mro__ and defines tons of new methods

* proxies everything through a not so efficietn mechanisms

Those things quite defy the purpose of the JIT - you're making tons of
very dynamic things that pypy generally assumes is "static enough", if
you wanted to do the same thing in C++, you would need to call gcc
with each request, that would not be so much fun.

If you really care about performance, consider swapping your web
framework to something more performance-oriented where JIT compilation
can help.

As a side note, we (me and my company, not to be confused with PyPy
open source project) do offer looking at proprietary code for
benchmarking purposes as a commercial service, look at
baroquesoftware.com

Cheers,
fijal



On Sat, Feb 7, 2015 at 1:12 AM, Tin Tvrtković <tinchester at gmail.com> wrote:
> Hello, PyPy folks!
>
> While trying to speed up one of my Django sites, I noticed a new version of
> PyPy
> had just been released. So I grabbed a fresh download of PyPy 3 (since this
> is
> a Python 3 codebase) and tried taking it out for a spin.
>
> However, as far as I can see, whatever I try PyPy is consistently slower
> than
> CPython for this.
>
> Since this is a proprietary site, I've basically ripped out all the code
> except
> my settings.py and my requirements; and am benchmarking the Django admin
> index.
> The results are about the same.
>
> I've set up a small repo that can be used to reproduce the environment:
> https://github.com/Tinche/PyPy-Django-Playground. There's additional info in
> the README there.
>
> These tests have been carried out on Ubuntu Trusty, 64-bit. CPython 3 is the
> system Python, 3.4. PyPy has been downloaded from the official site and
> unzipped.
>
> So what I basically do is set up an admin session, and use the Django main
> admin
> page. 200 warmup requests, then 100 benchmarked requests, look at the mean
> request time.
>
> Some results:
>
> Django's runserver, DEBUG mode:
>
> PyPy3            485.389 [ms]
> CPython 3.4      105.777 [ms]
>
> Django's runserver, no debug:
>
> PyPy3             44.661 [ms]
> CPython 3.4       18.697 [ms]
>
> Gunicorn, 1 worker, no debug:
>
> PyPy3             28.615 [ms]
> CPython 3.4       13.532 [ms]
>
> I don't exactly claim to be an expert on benchmarking, but assuming my site
> is similar to the Django admin, CPython's gonna be giving me better
> performance.
> Also the debug runserver performance is kinda worrying. Nobody's going to be
> running this in production, but it makes development a little slower and
> more
> annoying than it should be.
>
> Is there anything to make PyPy more competitive in these kinds of scenarios?
>
> Kind regards,
> Tin
> _______________________________________________
> pypy-dev mailing list
> pypy-dev at python.org
> https://mail.python.org/mailman/listinfo/pypy-dev


More information about the pypy-dev mailing list