diff --git a/pep-0509.txt b/pep-0509.txt index 110fa1f10..8398bb1fe 100644 --- a/pep-0509.txt +++ b/pep-0509.txt @@ -38,9 +38,9 @@ The speedup of optimizations depends on the speed of guard checks. This PEP proposes to add a private version to dictionaries to implement fast guards on namespaces. -Dictionary lookups can be skipped if the version does not change which +Dictionary lookups can be skipped if the version does not change, which is the common case for most namespaces. The version is globally unique, -so checking the version is also enough to check if the namespace +so checking the version is also enough to verify that the namespace dictionary was not replaced with a new dictionary. When the dictionary version does not change, the performance of a guard @@ -49,13 +49,14 @@ complexity is O(1). Example of optimization: copy the value of a global variable to function constants. This optimization requires a guard on the global variable to -check if it was modified. If the global variable is not modified, the -function uses the cached copy. If the global variable is modified, the -function uses a regular lookup, and maybe also deoptimize the function -(to remove the overhead of the guard check for next function calls). +check if it was modified after it was copied. If the global variable is +not modified, the function uses the cached copy. If the global variable +is modified, the function uses a regular lookup, and maybe also +deoptimizes the function (to remove the overhead of the guard check for +next function calls). See the `PEP 510 -- Specialized functions with guards -`_ for the concrete usage of +`_ for concrete usage of guards to specialize functions and for a more general rationale on Python static optimizers. @@ -63,7 +64,7 @@ Python static optimizers. Guard example ============= -Pseudo-code of an fast guard to check if a dictionary entry was modified +Pseudo-code of a fast guard to check if a dictionary entry was modified (created, updated or deleted) using an hypothetical ``dict_get_version(dict)`` function:: @@ -211,7 +212,7 @@ Example using an hypothetical ``dict_get_version(dict)`` function:: 103 ``dict.__setitem__(key, value)`` and ``dict.update(...)`` always -increases the version, even if the new value is identical or is equal to +increase the version, even if the new value is identical or is equal to the current value (even if ``(dict[key] is value) or (dict[key] == value)``). @@ -259,7 +260,7 @@ Integer overflow The implementation uses the C type ``PY_UINT64_T`` to store the version: a 64 bits unsigned integer. The C code uses ``version++``. On integer -overflow, the version is wrapped to ``0`` (and then continue to be +overflow, the version is wrapped to ``0`` (and then continues to be incremented) according to the C standard. After an integer overflow, a guard can succeed whereas the watched @@ -337,7 +338,7 @@ structure, the field has the C type ``PY_UINT64_T``. When a key is created or modified, the entry version is set to the dictionary version which is incremented at any change (create, modify, delete). -Pseudo-code of an fast guard to check if a dictionary key was modified +Pseudo-code of a fast guard to check if a dictionary key was modified using hypothetical ``dict_get_version(dict)`` and ``dict_get_entry_version(dict)`` functions::