Skip to content

[mypyc] Add primitives for int and bytes containment in bytes - #22409

Open
Jahongir-Qurbonov wants to merge 3 commits into
python:masterfrom
Jahongir-Qurbonov:mypyc-bytes-contains
Open

Jahongir-Qurbonov wants to merge 3 commits into
python:masterfrom
Jahongir-Qurbonov:mypyc-bytes-contains

Conversation

@Jahongir-Qurbonov

Copy link
Copy Markdown
Contributor

Add primitives for x in b / x not in b where b is bytes and x is int or bytes.

Previously these used PySequence_Contains. For a bytes item that is particularly slow, since bytes.__contains__ first tries to convert the item to an integer, which raises and clears a TypeError, and then acquires a buffer.

  • int in bytes: for an exact bytes object, a range check followed by memchr. Out-of-range values raise the same ValueError as CPython.
  • bytes in bytes: if both are exact bytes objects and the needle is at most 32 bytes long, search directly using memchr + memcmp. Longer needles fall back to the generic implementation, which has better worst-case behavior.
  • Subclasses (which may override __contains__) use the generic path.

Tests compare the results against the generic implementation (through Any) for all byte values, out-of-range and big ints, and all substrings (plus near-miss variants) of several haystacks.

Micro-benchmark (compiled code, before -> after, Python 3.13):

  • int in bytes (3.2M checks): 0.025s -> 0.0086s
  • 1-byte bytes in bytes (3.2M checks): 0.49s -> 0.026s
  • multi-byte bytes in bytes (3.2M checks): 0.49s -> 0.039s

Part of mypyc/mypyc#644.

@Jahongir-Qurbonov Jahongir-Qurbonov mentioned this pull request Nov 10, 2026
13 of 14 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant