Optimization: Response.text is recomputed every time it's accessed
@pederhan is already working on this.
Since Jun 12, 2024.
- Dominant language
- Python
- Stars
- 2
- Forks
- 7
- Avg merge
- 6d 11h
- Merged PRs (30d)
- 2
Description
This issue is related to the rewritten API code in #214.
We access the property Response.text multiple times in get_list_generic() (directly and through validate_*_response()):
This is inefficient, because the text is recomputed each time we access the property:
Furthermore, when not specifying encoding, it also has to run chardet.detect() on the text to determine the encoding:
HTTPX does not do this, which is why this came as a surprise to me.
Possible solution
We can make sure we only access Response.text once, and bind the result to some variable, so that we don't re-compute it each time we want to access it. This will require some changes to the validate_*_response() functions, and will make their signatures messier, as we still want to pass the Response object to the functions in order to produce good exception messages:
-def validate_list_response(response: Response) -> list[Json]:
+def validate_list_response(response: Response, text: str) -> list[Json]:
"""Parse and validate that a response contains a JSON array.
:param response: The response to validate.
+ :param text: The response content as text.
:raises ValidationError: If the response does not contain a valid JSON array.
:returns: Parsed response data as a list of Python objects.
"""
try:
- return ListResponse.validate_json(text)
+ return ListResponse.validate_json(text)
except ValueError as e:
raise ValidationError(f"{response.url} did not return a valid JSON array") from e
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.