I've been fiddling with extending some of the strategies in PyPy. My first
port of call has been to provide fast paths in IntegerListStrategy.find,
which is the basis of "x in l" and "l.index(x)". Previously this was very
fast if you looked up an integer, but rather slow if you tried up looking
anything else. Since we know exactly what the type of every element in such a
list is, there seem to be quite a few opportunities for optimisation. I have
left the code for the common case (looking up an int in an int list) as
before; but have provided various fast paths. Looking up floats and longs is
now much faster; for many other types (e.g. strings or user objects whose
class does not override __eq__) these return immediately. I have modified
FloatListStrategy similarly.
I attach the simple benchmark I used to test the changes. Before the patch
here are the results:
===> Integer lists
1 in l: 6.935
's' in l: 10.585
0 in l: 0.002
1.0 in l: 22.527
1L in l: 70.244
object() in l: 10.587
t1() in l: 14.433
t2() in l: 181.644
===> Float lists
1 in l: 17.131
's' in l: 44.034
0.8 in l: 0.002
1.0 in l: 9.372
1L in l: 96.680
object() in l: 70.232
t1() in l: 165.662
t2() in l: 181.558
After applying the patch:
===> Integer lists
1 in l: 6.928
's' in l: 0.001
0 in l: 0.001
1.0 in l: 6.929
1L in l: 6.928
object() in l: 0.002
t1() in l: 17.411
t2() in l: 139.246
===> Float lists
1 in l: 9.387
's' in l: 0.001
0.8 in l: 0.001
1.0 in l: 9.388
1L in l: 9.388
object() in l: 0.002
t1() in l: 129.031
t2() in l: 139.265
There is one slowdown ("t1() in l" for integer lists), which I can't explain,
but overall the pattern of speed-ups is clear. As you might expect, this
patch doesn't make much difference to the speed.pypy.org benchmarks.
The patch itself is here:
https://bitbucket.org/pypy/pypy/commits/599ed4285a6de348c7e7e732e303336d3160ce78
I welcome any comments on this. I don't pretend to know PyPy's internals
inside out, and I may have made one or more stupid changes in doing this. If
I have made a mistake, I'd love to know before I press on with other possible
changes!
Laurie
_______________________________________________
pypy-dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-dev