perf(parser): lazy-load envelopes to reduce Lambda cold start latency by ~900ms - #8405
Open
ErezMizrahi wants to merge 1 commit into
Open
Conversation
…rt latency Importing `parse` or `event_parser` from `aws_lambda_powertools.utilities.parser` previously caused all 16 envelope modules to load eagerly via the package `__init__.py`, even when no envelope was used. This added ~900ms to Lambda cold start for any function using the parser without an envelope (the common case for API Gateway handlers). The fix uses Python's module-level `__getattr__` to defer loading of `envelopes` and `BaseEnvelope` until they are actually accessed. Public API is unchanged — existing code importing from this module continues to work without modification. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
|
Thanks a lot for your first contribution! Please check out our contributing guidelines and don't hesitate to ask whatever you need. |
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Issue number: closes #8406
Summary
Changes
envelopesandBaseEnvelopeinparser/__init__.pywith a module-level__getattr__that defers loading until those names are actually accessedparsedoes not load any envelope modulesUser experience
Before: Any Lambda function importing
parseorevent_parserfromaws_lambda_powertools.utilities.parsercaused all 16 envelope modules to load eagerly at cold start — even when no envelope was ever used.After: Envelope modules are only imported on first access (e.g. when passing
envelope=SqsEnvelopetoparse()). Functions that useparse()without an envelope pay zero envelope-loading cost.Measured impact: ~900ms reduction in Lambda INIT_DURATION for API Gateway handlers using
parse()without an envelope. Profiled usingPYTHONPROFILEIMPORTTIME=1on AWS Lambda (arm64, Python 3.13, 1024MB):Public API is fully preserved —
from aws_lambda_powertools.utilities.parser import envelopesandfrom aws_lambda_powertools.utilities.parser import BaseEnvelopecontinue to work exactly as before.By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
Disclaimer: We value your time and bandwidth. As such, any pull requests created on non-triaged issues might not be successful.