Avoid cloning immutable decode inputs#36
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
This pull request optimizes the Python imdecode_py binding to avoid an unconditional clone of immutable encoded inputs when decoding outside the GIL, while adding regression coverage for both immutable and mutable input buffers.
Changes:
- Switch
imdecode_pyto acceptpyo3::pybacked::PyBackedBytesand remove the unconditionalto_vec()copy beforeallow_threads. - Add a Python test to validate decoding works for both
bytesandbytearrayinputs.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| tests/test_python_bindings.py | Adds coverage ensuring imdecode_py works for both bytes and bytearray buffers. |
| src/python_bindings.rs | Removes the unconditional encoded-buffer clone by using PyBackedBytes across the allow_threads boundary. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
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.
Summary
bytesstorage withPyBackedByteswhile decoding outside the GILto_vec()copybytearrayinputs through PyO3-owned snapshot storageRoot cause
The GIL-release path cloned every encoded input before decode so the borrowed Python slice could cross the
allow_threadsboundary. PyO3 already provides a Send/Sync owned view that keeps immutable Python bytes alive without copying.Performance
The avoided copy is proportional to encoded input size. A 32 MiB rejected-input probe fell from 0.500 ms to effectively decoder-call overhead (0.0005 ms), isolating the removed copy. For real images, decoder work still dominates; this is a smaller win than the resize/crop changes.
Validation
cargo test --features opencv,simd(60 passed)