[Python-Dev] Second milestone of FAT Python
Sven R. Kunze
srkunze at mail.de
Wed Nov 4 15:14:37 EST 2015
Hi Victor,
great to hear. I think everybody here appreciates your efforts.
Do you think there will be any change of merging this back into CPython?
Best,
Sven
On 04.11.2015 09:50, Victor Stinner wrote:
> Hi,
>
> I'm writing a new "FAT Python" project to try to implement
> optimizations in CPython (inlining, constant folding, move invariants
> out of loops, etc.) using a "static" optimizer (not a JIT). For the
> background, see the thread on python-ideas:
> https://mail.python.org/pipermail/python-ideas/2015-October/036908.html
>
> See also the documentation:
> https://hg.python.org/sandbox/fatpython/file/tip/FATPYTHON.rst
> https://hg.python.org/sandbox/fatpython/file/tip/ASTOPTIMIZER.rst
>
> I implemented the most basic optimization to test my code: replace
> calls to builtin functions (with constant arguments) with the result.
> For example, len("abc") is replaced with 3. I reached the second
> milestone: it's now possible to run the full Python test suite with
> these optimizations enabled. It confirms that the optimizations don't
> break the Python semantic.
>
> Example:
> ---
> >>> def func():
> ... return len("abc")
> ...
> >>> import dis
> >>> dis.dis(func)
> 2 0 LOAD_GLOBAL 0 (len)
> 3 LOAD_CONST 1 ('abc')
> 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
> 9 RETURN_VALUE
>
> >>> len(func.get_specialized())
> 1
> >>> specialized=func.get_specialized()[0]
> >>> dis.dis(specialized['code'])
> 2 0 LOAD_CONST 1 (3)
> 3 RETURN_VALUE
> >>> len(specialized['guards'])
> 2
>
> >>> func()
> 3
>
> >>> len=lambda obj: "mock"
> >>> func()
> 'mock'
> >>> func.get_specialized()
> []
> ---
>
> The function func() has specialized bytecode which returns directly 3
> instead of calling len("abc"). The specialized bytecode has two guards
> dictionary keys: builtins.__dict__['len'] and globals()['len']. If one
> of these keys is modified, the specialized bytecode is simply removed
> (when the function is called) and the original bytecode is executed.
>
>
> You cannot expect any speedup at this milestone, it's just to validate
> the implementation. You can only get speedup if you implement
> *manually* optimizations. See for example posixpath.isabs() which
> inlines manually the call to the _get_sep() function. More
> optimizations will be implemented in the third milestone. I don't know
> yet if I will be able to implement constant folding, function inlining
> and/or moving invariants out of loops.
>
>
> Download, compile and test FAT Python with:
>
> hg clone http://hg.python.org/sandbox/fatpython
> ./configure && make && ./python -m test test_astoptimizer test_fat
>
>
> Currently, only 24 functions are specialized in the standard library.
> Calling a builtin function with constant arguments in not common (it
> was expected, it's only the first step for my optimizer). But 161
> functions are specialized in tests.
>
>
> To be honest, I had to modify some tests to make them pass in FAT
> mode. But most changes are related to the .pyc filename, or to the
> exact size in bytes of dictionary objects.
>
> FAT Python is still experimental. Currently, the main bug is that the
> AST optimizer can optimize a call to a function which is not the
> expected builtin function. I already started to implement code to
> understand namespaces (detect global and local variables), but it's
> not enough yet to detect when a builtin is overriden. See TODO.rst for
> known bugs and limitations.
>
> Victor
>
>
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: https://mail.python.org/mailman/options/python-dev/srkunze%40mail.de
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20151104/3210f0ec/attachment.html>
More information about the Python-Dev
mailing list