Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better stats for LOAD_ATTR and STORE_ATTR #100295

Merged
merged 3 commits into from
Dec 16, 2022

Conversation

markshannon
Copy link
Member

@markshannon markshannon commented Dec 16, 2022

This PR provides better stats for LOAD_ATTR and STORE_ATTR, differentiating several class attributes.
There is a slight change to specializing behavior, but it seems to make no difference in practice.

The main change is for simple attributes of a class.

Consider

class C: 
    i = 0

c = C()
c.i

c.i is not specialized and the failure is reported as "not in dict".
i isn't in the instance's dict, but that's not the problem.
With this PR, the failure is reported as "class attr simple" which is much more informative.

The change in specialization behavior is that if an instance attribute shadows a non-data descriptor, it is no longer specialized.
This has no effect on the hit rate, which remains at 82%, but does convert some misses to deferreds.

@Fidget-Spinner
Copy link
Member

Interesting, the change in specialisation behavior is that instead of falling through and trying to specialise dict assess, we just fail immediately right?

I'm surprised the spec failures only increased by 1%.

@markshannon
Copy link
Member Author

I think what is happening is that shadowing is rare, and is usually code that stores a default value on the class, shadowing it if a non-default value is needed on the instance.

So we tend to get a lot of misses anyway.

It is generally considered good practice to set all attributes in the __init__ method, so this case should get rarer as time goes by.

@markshannon markshannon merged commit 289c112 into python:main Dec 16, 2022
@markshannon markshannon deleted the better-stats-load-attr branch December 16, 2022 15:43
carljm added a commit to carljm/cpython that referenced this pull request Dec 16, 2022
* main:
  Improve stats presentation for calls. (pythonGH-100274)
  Better stats for `LOAD_ATTR` and `STORE_ATTR` (pythonGH-100295)
  pythongh-81057: Move the Cached Parser Dummy Name to _PyRuntimeState (python#100277)
  Document that zipfile's pwd parameter is a `bytes` object (python#100209)
  pythongh-99767: mark `PyTypeObject.tp_watched` as internal use only in table (python#100271)
  Fix typo in introduction.rst (python#100266)
  pythongh-78997: AttributeError if loading fails in LibraryLoader.__getattr__
  pythonGH-100234: Set a default value for random.expovariate() (pythonGH-100235)
  Remove uninformative itertools recipe (pythonGH-100253)
  pythonGH-99767: update PyTypeObject docs for type watchers (pythonGH-99928)
  Move stats for the method cache into the `Py_STAT` machinery (pythonGH-100255)
  pythonGH-100222: fix typo _py_set_opocde -> _py_set_opcode (pythonGH-100259)
  pythonGH-100000: Cleanup and polish various watchers code (pythonGH-99998)
  pythongh-90111: Minor Cleanup for Runtime-Global Objects (pythongh-100254)
shihai1991 added a commit to shihai1991/cpython that referenced this pull request Dec 18, 2022
* origin/main: (1306 commits)
  Correct CVE-2020-10735 documentation (python#100306)
  pythongh-100272: Fix JSON serialization of OrderedDict (pythonGH-100273)
  pythongh-93649: Split tracemalloc tests from _testcapimodule.c (python#99551)
  Docs: Use `PY_VERSION_HEX` for version comparison (python#100179)
  pythongh-97909: Fix markup for `PyMethodDef` members (python#100089)
  pythongh-99240: Reset pointer to NULL when the pointed memory is freed in argument parsing (python#99890)
  pythongh-99240: Reset pointer to NULL when the pointed memory is freed in argument parsing (python#99890)
  pythonGH-98831: Add DECREF_INPUTS(), expanding to DECREF() each stack input (python#100205)
  pythongh-78707: deprecate passing >1 argument to `PurePath.[is_]relative_to()` (pythonGH-94469)
  pythongh-99540: Constant hash for _PyNone_Type to aid reproducibility (pythonGH-99541)
  pythongh-100039: enhance __signature__ to work with str and callables (pythonGH-100168)
  pythongh-99830: asyncio: Document returns of remove_{reader,writer} (python#100302)
  "Compound statement" docs: Fix with-statement step indexing (python#100286)
  pythonGH-90043: Handle NaNs in COMPARE_OP_FLOAT_JUMP (pythonGH-100278)
  Improve stats presentation for calls. (pythonGH-100274)
  Better stats for `LOAD_ATTR` and `STORE_ATTR` (pythonGH-100295)
  pythongh-81057: Move the Cached Parser Dummy Name to _PyRuntimeState (python#100277)
  Document that zipfile's pwd parameter is a `bytes` object (python#100209)
  pythongh-99767: mark `PyTypeObject.tp_watched` as internal use only in table (python#100271)
  Fix typo in introduction.rst (python#100266)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants