[pypy-dev] sys._getframe(1).f_locals is very slow on PyPy 1.8

Makoto Kuwata kwa at kuwata-lab.com
Sun May 27 12:30:28 CEST 2012


Hi Ronny,

Thank you for your reply.
You mean that sys._getframe() will remain slow on PyPy.
I'll try other way (instead of sys._getframe()) to make Tenjin faster on PyPy.

--
regards,
makoto kuwata

On Sun, May 27, 2012 at 6:09 PM, Ronny Pfannschmidt
<Ronny.Pfannschmidt at gmx.de> wrote:
> Hi Makoto,
>
> currently sys._getframe() is mostly killing the jit
> since it currently needs access to all frame objects,
>
> if i remember correct (arigo, fijal or anto will know for sure),
> the jit currently just bails out if it gets a sys._getframe call
>
> (which easyly explain the ~34 times slower  in your test)
>
> i think there are ways to support it,
> but i currently don't have the time/knowledge to check which of them work
>
> -- Ronny
>
>
> On 05/27/2012 06:24 AM, Makoto Kuwata wrote:
>>
>> Hi,
>>
>> I found that sys._getframe() (or sys._getframe().f_locals) is
>> very slow in PyPy 1.8.
>> For example, the following takes only 0.0398 sec on PyPy 1.8:
>>
>>       def f5(x): return f4(x)
>>       def f4(x): return f3(x)
>>       def f2(x): return f1(x)
>>       def f1(x): reutrn None               ## just return None
>>       for _ in xrange(1000000):
>>           f5(0)
>>
>> But the next one takes 1.3563 sec.
>>
>>       def f5(x): return f4(x)
>>       def f4(x): return f3(x)
>>       def f2(x): return f1(x)
>>       def f1(x): reutrn sys._getframe(1)    ## calls sys._getframe(1)
>>       for _ in xrange(1000000):
>>           f5(0)
>>
>> Is there any plan to make it faster in the future release?
>>
>>
>> Background
>> ----------
>>
>> I'm an author of Tenjin, a high-speed template engine for Python.
>> Tenjin supports PyPy officially, and I received a report that
>> there are some cases in which Tenjin is very slow on PyPy.
>>
>> I investigated report and found that it is the sys._getframe()
>> and sys._getframe().f_locals that makes Tenjin much slow on PyPy.
>>
>> Tenjin uses sys._getframe(1).f_locals in order to access to
>> caller's local variables. It is necessary for Tenjin.
>>
>>
>> Benchmark
>> ---------
>>
>> Here is a benchmark script to measure cost of sys._getframe(1)
>> and sys._getframe(1).f_locals.
>> (You must install Benchmarker library to run it.)
>>
>> https://gist.github.com/2802160
>>
>> Benchmark result shows that:
>>
>> * Cost of sys._getframe(1) and sys._getframe(1).f_locals is
>>   not so much on CPython but very big on PyPy.
>> * Nested depth os function call affects to cost of them.
>>   For example:
>>
>>       def f5(x): return f4(x)
>>       def f4(x): return f3(x)
>>       def f2(x): return f1(x)
>>       def f1(x): reutrn sys._getframe(1)
>>       f5(0)
>>
>>   is much slower than:
>>
>>       def f2(x): return f1(x)
>>       def f1(x): reutrn sys._getframe(1)
>>       f2(0)
>>
>>
>>
>> By the way, PyPy is awesome.
>> It is not only faster than CPython but also has high-level
>> compatibility with CPython. Almost of all test script of Tenjin
>> works on PyPy. Great.
>> I hope Tenjin works much faster on PyPy.
>>
>> --
>> regards,
>> makoto kuwata
>> _______________________________________________
>> pypy-dev mailing list
>> pypy-dev at python.org
>> http://mail.python.org/mailman/listinfo/pypy-dev
>
>


More information about the pypy-dev mailing list