classification
Title: Globals / builtins cache
Type: performance Stage: patch review
Components: Interpreter Core Versions: Python 3.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: alex, belopolsky, benjamin.peterson, dmalcolm, eric.smith, georg.brandl, haypo, inada.naoki, jhylton, nnorwitz, pitrou, rhettinger, sdahlbac, thomaslee, titanstar
Priority: low Keywords: patch

Created on 2010-11-12 21:24 by pitrou, last changed 2016-12-07 09:57 by inada.naoki.

Files
File name Uploaded Description Edit
globcache5.patch pitrou, 2010-11-12 21:24
Messages (5)
msg121081 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2010-11-12 21:24
Here is the Nth patch for a globals/builtins cache. As other caches at the same kind, it shows very small to no gain on non-micro benchmarks, showing that contrary to popular belief, globals/builtins lookup are not a major roadblock in today's Python performance.

However, this patch could be useful in combination with other optimizations such as issue10399.  Indeed, using the globals/builtins version id, it is easy and very cheap to detect whether the function pointed to by a global name has changed or not.

As for micro-benchmarks, they show that there is indeed a good improvement on builtins lookups:

$ ./python -m timeit "x=len;x=len;x=len;x=len;x=len;x=len;x=len;x=len;x=len;x=len;"
-> without patch:
1000000 loops, best of 3: 0.282 usec per loop
-> with patch:
10000000 loops, best of 3: 0.183 usec per loop
msg121105 - (view) Author: Skip Montanaro (skip.montanaro) * Date: 2010-11-13 01:56
Might such a cache lay the groundwork for more aggressive optimizations
by JITs like Unladen Swallow?
msg121147 - (view) Author: Brett Cannon (brett.cannon) * (Python committer) Date: 2010-11-13 18:03
Unladen actually has something like this in place for performance optimizations. Not sure how Antoine's approach differs, though.
msg121150 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2010-11-13 18:14
There aren't many possible approaches. The more complex variants of globals caches try to also speedup writes, which is IMO a waste of time since rebinding globals is not a good coding practice, and especially not in the middle of time-critical loops.

(by the way, the patch only addresses normal functions, but generators would easily benefit from a similar treatment)

And Skip is right that this would be most useful when paired with a JIT (allowing for aggressive specialization, and possibly inlining).
msg282608 - (view) Author: INADA Naoki (inada.naoki) * (Python committer) Date: 2016-12-07 09:57
dict has ma_version for now.

@haypo, how do you think about this patch?
Would you reimplement global cache?  Or may I update this patch?
History
Date User Action Args
2016-12-07 09:57:49inada.naokisetmessages: + msg282608
versions: + Python 3.7, - Python 3.3
2016-01-27 17:51:48inada.naokisetnosy: + inada.naoki
2013-04-07 23:10:18hayposetnosy: + haypo
2013-01-11 17:11:37brett.cannonsetnosy: - brett.cannon
2011-03-19 19:10:19skip.montanarosetnosy: - skip.montanaro
2010-11-13 18:14:13pitrousetmessages: + msg121150
2010-11-13 18:03:15brett.cannonsetnosy: + brett.cannon
messages: + msg121147
2010-11-13 06:59:25georg.brandlsetnosy: + georg.brandl
2010-11-13 01:56:13skip.montanarosetnosy: + skip.montanaro
messages: + msg121105
2010-11-12 23:59:49eric.smithsetnosy: + eric.smith
2010-11-12 21:24:29pitroucreate