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

Restore __slots__ to core objects #127441

Merged
merged 17 commits into from
Oct 3, 2024
Merged

Restore __slots__ to core objects #127441

merged 17 commits into from
Oct 3, 2024

Conversation

bdraco
Copy link
Member

@bdraco bdraco commented Oct 3, 2024

Proposed change

One of the downsides to using @cached_property is we cannot also use __slots__. With the @under_cached_property we still can because the cache dict is implemented as self._cache instead of using self.__dict__ which __slots__ removed. Since we churn and throw away these objects frequently, the memory and creation time adds up. While the benefit of @cached_property greatly outweighs the benefit of __slots__ its nice to be able to have both.

before

>>> from pympler.asizeof import asizeof
>>> from homeassistant import core
>>> asizeof(core.Context())
640
>>> 

after

>>> from pympler.asizeof import asizeof
>>> from homeassistant import core
>>> asizeof(core.Context())
224
>>> 

Type of change

  • Dependency upgrade
  • Bugfix (non-breaking change which fixes an issue)
  • New integration (thank you!)
  • New feature (which adds functionality to an existing integration)
  • Deprecation (breaking change to happen in the future)
  • Breaking change (fix/feature causing existing functionality to break)
  • Code quality improvements to existing code or addition of tests

Additional information

  • This PR fixes or closes issue: fixes #
  • This PR is related to issue:
  • Link to documentation pull request:

Checklist

  • The code change is tested and works locally.
  • Local tests pass. Your PR cannot be merged unless tests pass
  • There is no commented out code in this PR.
  • I have followed the development checklist
  • I have followed the perfect PR recommendations
  • The code has been formatted using Ruff (ruff format homeassistant tests)
  • Tests have been added to verify that the new code works.

If user exposed functionality or configuration variables are added/changed:

If the code communicates with devices, web services, or third-party tools:

  • The manifest file has all fields filled out correctly.
    Updated and included derived files by running: python3 -m script.hassfest.
  • New or updated dependencies have been added to requirements_all.txt.
    Updated by running python3 -m script.gen_requirements_all.
  • For the updated dependencies - a link to the changelog, or at minimum a diff between library versions is added to the PR description.

To help with the load of incoming pull requests:

bdraco added 7 commits October 2, 2024 11:37
propcache is derived from yarl which uses an accelerated cached_property
implementation. It also has an under_cached_property implementation which
stores the cache in self._cache which is compatiblity with __slots__ which
will allow use to restore __slots__ to many objects that we had to remove it
from to allow for the stdlib @cached_property which does not support __slots__

Currently yarl and aiohttp both implement the same property caching
code and cython code. The goal of the propcache library is to replace
both implementations in yarl and aiohttp and maintain it in a single place
in aiohttp 3.11 propcache is expected to replace the internal yarl and
aiohttp implementations.
@bdraco bdraco changed the title DNM: Restore __slots__ to core objects Restore __slots__ to core objects Oct 3, 2024
bdraco added a commit to bdraco/home-assistant that referenced this pull request Oct 3, 2024
bdraco added a commit that referenced this pull request Oct 3, 2024
same as #127441 but for the registries
@bdraco bdraco mentioned this pull request Oct 3, 2024
19 tasks
@bdraco
Copy link
Member Author

bdraco commented Oct 3, 2024

FAILED tests/components/reolink/test_init.py::test_new_device_discovered - AssertionError: assert 24 == 0
 +  where 24 = <AsyncMock name='Host().logout' spec='function' id='140036042898656'>.call_count
 +    where <AsyncMock name='Host().logout' spec='function' id='140036042898656'> = <NonCallableMagicMock name='Host()' spec='Host' id='140036030884384'>.logout

test failure is unrelated

@bdraco bdraco marked this pull request as ready for review October 3, 2024 18:37
@bdraco bdraco requested a review from a team as a code owner October 3, 2024 18:37
@bdraco bdraco mentioned this pull request Oct 3, 2024
19 tasks
@frenck frenck merged commit db494de into dev Oct 3, 2024
39 of 40 checks passed
@frenck frenck deleted the fast_cached_property_slots branch October 3, 2024 20:23
@bdraco
Copy link
Member Author

bdraco commented Oct 3, 2024

Thanks. Adding them back to the registries will require some more work since they were gone from there longer and mocks are missing some values

@github-actions github-actions bot locked and limited conversation to collaborators Oct 4, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants