[Python-Dev] PEP 509: Add a private version to dict
Yury Selivanov
yselivanov.ml at gmail.com
Wed Jan 20 13:02:56 EST 2016
On 2016-01-18 5:43 PM, Victor Stinner wrote:
> Is someone opposed to this PEP 509?
>
> The main complain was the change on the public Python API, but the PEP
> doesn't change the Python API anymore.
>
> I'm not aware of any remaining issue on this PEP.
Victor,
I've been experimenting with the PEP to implement a per-opcode
cache in ceval loop (I'll share my progress on that in a few
days). This allows to significantly speedup LOAD_GLOBAL and
LOAD_METHOD opcodes, to the point, where they don't require
any dict lookups at all. Some macro-benchmarks (such as
chameleon_v2) demonstrate impressive ~10% performance boost.
I rely on your dict->ma_version to implement cache invalidation.
However, besides guarding against version change, I also want
to guard against the dict being swapped for another dict, to
avoid situations like this:
def foo():
print(bar)
exec(foo.__code__, {'bar': 1}, {})
exec(foo.__code__, {'bar': 2}, {})
What I propose is to add a pointer "ma_extra" (same 64bits),
which will be set to NULL for most dict instances (instead of
ma_version). "ma_extra" can then point to a struct that has a
globally unique dict ID (uint64), and a version tag (unit64).
A macro like PyDict_GET_ID and PyDict_GET_VERSION could then
efficiently fetch the version/unique ID of the dict for guards.
"ma_extra" would also make it easier for us to extend dicts
in the future.
Yury
More information about the Python-Dev
mailing list