Hacker News new | past | comments | ask | show | jobs | submit login
PyPy 1.4: Ouroboros in practice (morepypy.blogspot.com)
127 points by aaw on Nov 26, 2010 | hide | past | favorite | 20 comments



Currently testing a CPU intensive algorithm I need for my current research project. Hoping it will save me some time. When I am done I will post the results!

[Edit:]

Pretty good so far!

    ~/stuff/Programming/faultire/src/
    hendersont@glycineportable src $ time pypy sleepytree/test_metricspace.py 
    .......
    ----------------------------------------------------------------------
    Ran 7 tests in 39.621s

    OK

    real    0m39.675s
    user    0m39.150s
    sys     0m0.170s
    ~/stuff/Programming/faultire/src/
    hendersont@glycineportable src $ time python sleepytree/test_metricspace.py 
    .......
    ----------------------------------------------------------------------
    Ran 7 tests in 69.442s

    OK

    real    1m9.483s
    user    1m8.970s
    sys     0m0.110s


Another Implementation

    ~/stuff/Programming/sleepytree/
    hendersont@glycineportable sleepytree $ time python test_metricspace.py -v
    test_distance (__main__.TestCompare) ... ok
    test_nondegenercy (__main__.TestCompare) ... ok
    test_symmetry (__main__.TestCompare) ... ok
    test_triangle_inequality (__main__.TestCompare) ... ok
    test_contains (__main__.TestTestNode) ... ok
    test_get (__main__.TestTestNode) ... ok
    test_iter (__main__.TestTestNode) ... ok

    ----------------------------------------------------------------------
    Ran 7 tests in 570.385s

    OK

    real    9m30.451s
    user    9m23.920s
    sys     0m1.730s
    ~/stuff/Programming/sleepytree/
    hendersont@glycineportable sleepytree $ time pypy test_metricspace.py -v
    test_distance (__main__.TestCompare) ... ok
    test_nondegenercy (__main__.TestCompare) ... ok
    test_symmetry (__main__.TestCompare) ... ok
    test_triangle_inequality (__main__.TestCompare) ... ok
    test_contains (__main__.TestTestNode) ... ok
    test_get (__main__.TestTestNode) ... ok
    test_iter (__main__.TestTestNode) ... ok

    ----------------------------------------------------------------------
    Ran 7 tests in 255.339s

    OK

    real    4m15.396s
    user    4m12.990s
    sys     0m0.310s


Could you please also run this benchmark compiled with Cython? Thanks,


Cython is not (nor is it intended to be) a drop-in Python compiler.


Interesting and promising. PyPy 1.4:

    >>>> t1 = time.time(); a=[x*x for x in xrange(1000000)]; time.time()-t1
    0.38609600067138672
    >>>> t1 = time.time(); a=[x*x+math.sin(x/1000000.) for x in xrange(1000000)]; time.time()-t1
    0.42182803153991699
Python 2.7:

    >>> t1 = time.time(); a=[x*x for x in xrange(1000000)]; time.time()-t1
    0.25005197525024414
    >>> t1 = time.time(); a=[x*x+math.sin(x/1000000.) for x in xrange(1000000)]; time.time()-t1
    0.6075689792633057
Both running in 64-bit on a 2.53GHz Core 2 Duo. It looks like PyPy's JIT has some fixed overhead, but can heavily optimize operations once it gets going.


There is something strange with the example.

  $ pypy -mtimeit -s'import math; sin=math.sin' \
      '[x*x+sin(x/1e6) for x in xrange(1000000)]'
  10 loops, best of 3: 156 msec per loop
With no division it is slower (?):

  $ pypy -mtimeit -s'import math; sin=math.sin' \
       '[x*x+sin(x) for x in xrange(1000000)]'
  10 loops, best of 3: 188 msec per loop
CPython shows expected behavior:

  $ python2.7 -mtimeit -s'import math; sin=math.sin' \
    '[x*x+sin(x) for x in xrange(1000000)]'
  10 loops, best of 3: 231 msec per loop

  $ python2.7 -mtimeit -s'import math; sin=math.sin' \
    '[x*x+sin(x/1e6) for x in xrange(1000000)]'
  10 loops, best of 3: 253 msec per loop
CPython is faster for tiny cases:

  $ pypy -mtimeit '[x*x for x in xrange(1000000)]'
  10 loops, best of 3: 126 msec per loop

  $ python2.7 -mtimeit '[x*x for x in xrange(1000000)]'
  10 loops, best of 3: 67.3 msec per loop

  $ pypy -mtimeit '[x*x*x for x in xrange(1000000)]'
  10 loops, best of 3: 123 msec per loop

  $ python2.7 -mtimeit '[x*x*x for x in xrange(1000000)]'
  10 loops, best of 3: 118 msec per loop


With no division it is slower (?)

Very interesting. Looks like sin is faster for arguments less than pi/4 (~=0.7853981633974483):

Edit: "Intel's sin/cos implementation sucks golfballs through gardenhoses for arguments outside of [-pi/4,pi/4]": http://stackoverflow.com/questions/523531/fast-transcendent-...

    $ pypy -mtimeit -s'import math; sin=math.sin; a=0.786' '[sin(a) for x in xrange(1000000)]'
    10 loops, best of 3: 395 msec per loop

    $ pypy -mtimeit -s'import math; sin=math.sin; a=0.785' '[sin(a) for x in xrange(1000000)]'
    10 loops, best of 3: 375 msec per loop

    $ python -mtimeit -s'import math; sin=math.sin; a=0.786' '[sin(a) for x in xrange(1000000)]'
    10 loops, best of 3: 177 msec per loop

    $ python -mtimeit -s'import math; sin=math.sin; a=0.785' '[sin(a) for x in xrange(1000000)]'
    10 loops, best of 3: 155 msec per loop


I think this is the first PyPy release that's actually viable to use for me (because of x86-64). Very exciting!

(Hope they catch up with 2.6 - or 2.7 - soon, though.)


We have a fast-forward branch that is currently working on moving to Python 2.7.


I know, I hope its merging is followed by a quick release. :)


>PyPy is a very compliant Python interpreter, almost a drop-in replacement for CPython.

What still works in CPython but not PyPy?


pycrypto, gmpy, pyOpenSSL, psycopg2 (fixes in progress, I hear), PyV8, Pyflakes


pyOpenSSL, which means you can't use SSL in twisted :(


Anything that relies on C extensions. Numpy is the biggie for me.


32-bit pypy 1.4 can compile and run some C extensions; they just have to really well-written (not relying on CPython behavior). It can't find documentation for this, so freenode/#pypy is a good place to get details.


wxPython is something I personally miss.



That blog post just shows a proof of concept, not official support.


Sorry to bother people with this question, but I've spent ages searching my internet history for an answer, to no avail:

A few weeks ago someone posted a Python related link on HN. It was some sort of guide or in-depth analysis, with code snippets. The code snippets did not have any syntax colouring. The background of the site was a nice dark/deep green texture (slightly bluish maybe). The top of the page had a sort of golden bookmark icon in the corner.

If anyone remembers that site please let me know the url or the title. I need to find it again.


I hope they add support for JIT with the Stackless features.




Consider applying for YC's W25 batch! Applications are open till Nov 12.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: