fix(perf): avoid repeated scan of entire venv via packages_distributions() at import time#16579
Conversation
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
There was a problem hiding this comment.
Code Review
This pull request optimizes the _get_pypi_package_name function by replacing the slow packages_distributions() scan with targeted metadata.distribution() lookups. It also introduces lazy resolution for package labels to improve performance on supported Python versions. However, the top-level import of importlib.metadata breaks compatibility with Python 3.7. Feedback was provided to handle this as an optional import and to ensure _get_pypi_package_name handles cases where the metadata module is unavailable.
packages/google-api-core/google/api_core/_python_version_support.py
Outdated
Show resolved
Hide resolved
packages/google-api-core/google/api_core/_python_version_support.py
Outdated
Show resolved
Hide resolved
packages_distributions() scans every installed package in the environment to build a complete module-to-distribution mapping. In large venvs (500+ packages, common with many google-cloud-* libs), this causes multi-second import delays for google.api_core and every library that depends on it. Two changes: - Wrap packages_distributions() with functools.cache so the expensive O(n) scan happens at most once per process. - Defer the package label resolution in check_python_version() so it only runs when a warning is actually emitted, not on the common happy path of a supported Python version.
e63555e to
6425506
Compare
|
Thanks for your PR! It looks very sensible. We'll approve once it passes the presubmits. |
daniel-sanche
left a comment
There was a problem hiding this comment.
LGTM, thanks for putting this together!
PR created by the Librarian CLI to initialize a release. Merging this PR will auto trigger a release. Librarian Version: v0.0.0-20260407211006-7cd74ea13ba9 Language Image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:234b9d1f2ddb057ed7ac6a38db0bf8163d839c65c6cf88ade52530cddebce59e <details><summary>bigquery-magics: v0.13.0</summary> ## [v0.13.0](bigquery-magics-v0.12.2...bigquery-magics-v0.13.0) (2026-04-09) ### Features * drop support for Python 3.9 (#16587) ([961eacd](961eacd0)) * deprecate `--engine=bigframes`, run `%load_ext bigframes` and use `%%bqsql` magics instead (#16573) ([dbaf8f5](dbaf8f54)) </details> <details><summary>google-api-core: v2.30.3</summary> ## [v2.30.3](google-api-core-v2.30.2...google-api-core-v2.30.3) (2026-04-09) ### Bug Fixes * avoid repeated scan of entire venv via packages_distributions() at import time (#16579) ([c5728b2](c5728b24)) </details> <details><summary>google-apps-chat: v0.8.0</summary> ## [v0.8.0](google-apps-chat-v0.7.0...google-apps-chat-v0.8.0) (2026-04-09) ### Features * Addition of Section and SectionItem APIs (PiperOrigin-RevId: 893488928) ([56ccbd8](56ccbd86)) * Support app authentication with admin-consent scopes for Chat API ListMessages, GetMessage, GetSpaceEvent and ListSpaceEvents (PiperOrigin-RevId: 893619899) ([56ccbd8](56ccbd86)) ### Documentation * Update reference documentation for Chat API ListMessages, GetMessage, GetSpaceEvent and ListSpaceEvents. (PiperOrigin-RevId: 893619899) ([56ccbd8](56ccbd86)) </details> <details><summary>google-auth: v2.49.2</summary> ## [v2.49.2](google-auth-v2.49.1...google-auth-v2.49.2) (2026-04-09) ### Bug Fixes * use requests transport for GCE MDS (#16480) ([614a3d0](614a3d04)) </details> <details><summary>google-cloud-appoptimize: v0.1.0</summary> ## [v0.1.0](google-cloud-appoptimize-v0.0.0...google-cloud-appoptimize-v0.1.0) (2026-04-09) ### Features * onboard a new library (PiperOrigin-RevId: 895558469) ([8e92bae](8e92bae8)) </details> <details><summary>google-cloud-dlp: v3.36.0</summary> ## [v3.36.0](google-cloud-dlp-v3.35.0...google-cloud-dlp-v3.36.0) (2026-04-09) ### Features * added support for detecting key-value pairs in client provided metadata (PiperOrigin-RevId: 895098649) ([56ccbd8](56ccbd86)) </details> <details><summary>google-cloud-iamconnectorcredentials: v0.1.0</summary> ## [v0.1.0](google-cloud-iamconnectorcredentials-v0.0.0...google-cloud-iamconnectorcredentials-v0.1.0) (2026-04-09) ### Features * onboard a new library (PiperOrigin-RevId: 889980347) ([2a3458c](2a3458c8)) </details> <details><summary>google-cloud-pubsub: v2.37.0</summary> ## [v2.37.0](google-cloud-pubsub-v2.36.0...google-cloud-pubsub-v2.37.0) (2026-04-09) ### Documentation * Fix documentation URL AIInference MessageTransform service_account_email field (PiperOrigin-RevId: 895485801) ([56ccbd8](56ccbd86)) </details> <details><summary>google-cloud-translate: v3.26.0</summary> ## [v3.26.0](google-cloud-translate-v3.25.0...google-cloud-translate-v3.26.0) (2026-04-09) ### Features * A new field `mime_type` is added to message `.google.cloud.translation.v3.AdaptiveMtTranslateRequest` (PiperOrigin-RevId: 895422613) ([56ccbd8](56ccbd86)) </details> <details><summary>pandas-gbq: v0.35.0</summary> ## [v0.35.0](pandas-gbq-v0.34.1...pandas-gbq-v0.35.0) (2026-04-09) ### Features * drop support for Python 3.9 (#16476) ([f38cd44](f38cd44b)) </details>
packages_distributions() scans every installed package in the environment to build a complete module-to-distribution mapping. In large venvs (500+ packages, common with many google-cloud-* libs), this causes multi-second import delays for google.api_core and every library that depends on it.
This PR contains 2 changes:
packages_distributions()with functools.cache so the expensive O(n) scan happens at most once per process.check_python_version()so it only runs when a warning is actually emitted, not on the common happy path of a supported Python version.Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly:
Fixes #15015 and #16552.