[pypy-dev] [pypy-commit] pypy default: Unroll list.count() when the list is virtual or very small and constant lenght

Carl Friedrich Bolz cfbolz at gmx.de
Fri Aug 30 11:23:07 CEST 2013


Hi Alex,

please revert this change, it can lead to combinatorial explosion: it
can give a bridge per pattern of where in the list the object is found.

Cheers,

Carl Friedrich

On 29/08/13 23:47, alex_gaynor wrote:
> Author: Alex Gaynor <alex.gaynor at gmail.com>
> Branch: 
> Changeset: r66432:185512e0c4df
> Date: 2013-08-29 15:47 -0700
> http://bitbucket.org/pypy/pypy/changeset/185512e0c4df/
> 
> Log:	Unroll list.count() when the list is virtual or very small and
> 	constant lenght
> 
> diff --git a/pypy/module/pypyjit/test_pypy_c/test_containers.py b/pypy/module/pypyjit/test_pypy_c/test_containers.py
> --- a/pypy/module/pypyjit/test_pypy_c/test_containers.py
> +++ b/pypy/module/pypyjit/test_pypy_c/test_containers.py
> @@ -241,3 +241,22 @@
>          loop, = log.loops_by_filename(self.filepath)
>          ops = loop.ops_by_id('getitem', include_guard_not_invalidated=False)
>          assert log.opnames(ops) == []
> +
> +    def test_list_count_virtual_list(self):
> +        def main(n):
> +            i = 0
> +            while i < n:
> +                i += [n].count(n)
> +            return i
> +
> +        log = self.run(main, [1000])
> +        assert log.result == main(1000)
> +        loop, = log.loops_by_filename(self.filepath)
> +        assert loop.match("""
> +            i7 = int_lt(i5, i6)
> +            guard_true(i7, descr=...)
> +            guard_not_invalidated(descr=...)
> +            i9 = int_add(i5, 1)
> +            --TICK--
> +            jump(..., descr=...)
> +        """)
> diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
> --- a/pypy/objspace/std/listobject.py
> +++ b/pypy/objspace/std/listobject.py
> @@ -562,6 +562,8 @@
>          'L.reverse() -- reverse *IN PLACE*'
>          self.reverse()
>  
> +    @jit.look_inside_iff(lambda self, space, w_value:
> +            jit.loop_unrolling_heuristic(self, self.length(), UNROLL_CUTOFF))
>      def descr_count(self, space, w_value):
>          '''L.count(value) -> integer -- return number of
>          occurrences of value'''
> _______________________________________________
> pypy-commit mailing list
> pypy-commit at python.org
> http://mail.python.org/mailman/listinfo/pypy-commit
> 



More information about the pypy-dev mailing list