Skip to main content

High-performance C implementation of BPE tokenizer

Project description

CI

c-bpe

High-performance C implementation of BPE (Byte Pair Encoding) tokenizer with Python bindings.

This library provides fast and correct token counting for chunking algorithms with a focus on high performance. It implements novel algorithms for BPE tokenization that are both correct and significantly faster than existing solutions.

Attribution

This project is based on rs-bpe by gweidart, a Rust implementation of BPE tokenization. The C implementation ports the same novel algorithms to pure C for maximum portability and performance. The original Rust implementation is included in the rust/ directory for comparison benchmarking.

Installation

pip install c-bpe

c_bpe consistently outperforms tiktoken (March 7, 2026)

c_bpe throughput vs tiktoken

Key Features

  • Efficient token counting with linear time complexity even for adversarial inputs
  • Split text at exact token boundaries while respecting UTF-8 character boundaries
  • Incrementally count tokens while appending text to a chunk
  • Calculate token counts for sub-ranges of text with constant-time complexity
  • Python bindings with OpenAI-compatible interface

These operations are particularly important for LLM applications but are challenging to implement efficiently for BPE tokenization.

Motivation (problems this library aims to solve)

Existing BPE tokenizers often face performance and correctness issues when used for chunking operations:

Split-at-N-Tokens Problem

Naively splitting text after N tokens by first encoding the entire text and then selecting a boundary often produces suboptimal results:

  • The split point might not align with a UTF-8 character boundary
  • Dropping tokens until a character boundary is reached might result in chunks much shorter than desired
  • The algorithm wastes resources by encoding more text than necessary

Incremental Counting Problem

Incrementally counting tokens as text is appended is challenging with traditional implementations:

  • Recomputing the encoding after every append leads to quadratic complexity
  • Approximating counts by aggregating piece counts leads to incorrect results due to BPE's non-monotonic nature
  • Incorrect counting can cause problems when staying within token limits for LLM APIs

Interval Counting Problem

Counting tokens for arbitrary subranges traditionally requires reprocessing the entire substring:

  • Leads to poor performance for applications that need to count many subranges
  • Makes operations like binary search for token boundaries inefficient

Our library provides novel algorithms to solve these problems with superior performance characteristics.

Implementation

Core Algorithm

The novel O(n) algorithm preserves the exact output of the original BPE algorithm by tracking encodings of all text prefixes using mathematical properties of valid BPE encodings.

Instead of storing full token sequences for each prefix, only the last token of each prefix needs to be remembered. This is possible because:

  1. There exists exactly one valid encoding sequence for any input text
  2. Any substring of a valid encoding sequence is itself a valid encoding sequence
  3. Knowing the last token of a valid encoding sequence uniquely determines the full sequence

The algorithm determines the correct last token for each prefix by checking token compatibility with the preceding token, yielding a linear-time solution.

Backtracking Optimization

For average-case improvement, a backtracking-based algorithm:

  1. Tries the greedy approach first, using the longest matching token at each step
  2. Backtracks when necessary to produce a valid BPE encoding
  3. Uses a bitfield so worst-case runtime stays linear in input length

Data Structures

  • BytePairEncoding struct: Stores the concatenated token byte array, per-token start offsets, a BytesMap (bytes→token id), split_left/split_right arrays for token decomposition, a PairMap (pair→merged token), three Aho-Corasick automatons, and a next_prefix_match table.

  • PairMap: Open-addressing hash table (linear probing, 50% max load) for (token1, token2) → merged_id lookups. Uses a splitmix64 finaliser instead of byte-by-byte FNV-1a for the fixed 8-byte key, keeping the merge step cache-friendly.

  • BytesMap: Open-addressing hash table for bytes → token_id lookups. Uses FNV-1a hashing identical to Rust's fnv crate, ensuring consistent hash values across both implementations.

Aho-Corasick Automatons

Three Double-Array Aho-Corasick automatons are built over the token vocabulary at initialisation time:

  • longest_searcher (AC_KIND_LEFTMOST_LONGEST): leftmost-longest token match at each position — used for the backtrack encoder.
  • overlapping_searcher (AC_KIND_OVERLAPPING_FWD): all overlapping forward matches — used by AppendableEncoder to maintain per-byte AC state.
  • overlapping_searcher_rev (AC_KIND_OVERLAPPING_REV): all overlapping reverse matches — used by PrependableEncoder.

The Double-Array layout gives O(1) state transitions per input byte, making the automaton traversal extremely cache-friendly.

Special Purpose Encoders

  • AppendableEncoder: Stores one AppState per byte appended (ac_state, last_token, running count), allowing O(1) amortised count queries via the forward AC automaton.
  • PrependableEncoder: Mirror of AppendableEncoder using the reverse AC automaton — supports O(1) amortised queries while prepending.
  • IntervalEncoding: Precomputes a last_token, tree_id, tree_end, and tree_depth array per byte position, enabling typically-O(1) count(start, end) queries.
  • OpenAI-compatible Tokenizer: Hand-coded pre-tokenisation with PCRE2 UCD tables (regex splitting identical to tiktoken) feeding into the shared BPE encode/decode logic.

Performance

Our benchmarks show significant performance improvements over existing implementations:

Note: All benchmark results shown here were achieved using the Python bindings, not the direct native implementation. This provides a more realistic representation of the performance users will experience in Python applications.

Single-Text Tokenization

Text Size c_bpe vs tiktoken rs_bpe vs tiktoken
Small 2.9× faster 3.0× faster
Medium 1.7× faster 1.6× faster
Large 4.4× faster 2.3× faster

Encoding speed (benchmark.py results):

Encoding throughput

SMALL TEXT:
  tiktoken: 0.000102s
  c_bpe:    0.000035s
  rs_bpe:   0.000034s

MEDIUM TEXT:
  tiktoken: 0.001735s
  c_bpe:    0.001007s
  rs_bpe:   0.001092s

LARGE TEXT:
  tiktoken: 0.068093s
  c_bpe:    0.015330s
  rs_bpe:   0.029147s

Both libraries also provide significantly faster decoding and roundtrip operations:

Decoding speed:

Tokenizer timing comparison

SMALL TEXT:
  tiktoken: 0.000027s
  c_bpe:    0.000011s
  rs_bpe:   0.000018s

MEDIUM TEXT:
  tiktoken: 0.000200s
  c_bpe:    0.000076s
  rs_bpe:   0.000105s

LARGE TEXT:
  tiktoken: 0.003799s
  c_bpe:    0.001709s
  rs_bpe:   0.002504s

Batch Processing Performance

Batch Size c_bpe encode c_bpe decode rs_bpe encode rs_bpe decode
1 35× faster 165× faster 79× faster 94× faster
10 32× faster 92× faster 43× faster 100× faster
100 5× faster 94× faster 17× faster 52× faster
1000 22× faster 57× faster 13× faster 31× faster

Encode speedup vs tiktoken (all sizes):

Encode speedup vs tiktoken

Worst-Case Performance

While tiktoken shows quadratic growth for certain adversarial inputs, c_bpe maintains linear scaling even in worst-case scenarios. This is critical for production systems that need consistent performance guarantees.

Key Performance Advantages

  1. Memory Efficiency: Compact data structures (tightly-packed token byte arrays, power-of-2 hash tables at ≤50% load) and no redundant token storage
  2. Cache-Friendly Hash Tables: PairMap uses a splitmix64 finaliser for fixed 8-byte keys; BytesMap uses FNV-1a — both with linear probing for sequential memory access
  3. O(1) State Transitions: Double-Array Aho-Corasick automatons enable single-byte-per-step token matching without backtracking through the vocabulary
  4. Full LTO: Compiled with full Link-Time Optimisation (MSVC /GL+/LTCG / GCC -flto)
  5. No Correctness Trade-offs: Verified to produce token-for-token identical output to tiktoken

All benchmarks were run on standard hardware and results may vary based on your specific environment.

Python Usage Examples

Basic Tokenization

from c_bpe.bpe import openai

# Load OpenAI tokenizers (automatically caches for reuse)
cl100k_tokenizer = openai.cl100k_base()  # GPT-3.5/4 tokenizer
o200k_tokenizer = openai.o200k_base()    # o200k tokenizer

# Basic encoding
text = "Hello, world! This is an example."
tokens = cl100k_tokenizer.encode(text)
print(f"Encoded tokens: {tokens}")

# Basic decoding
decoded_text = cl100k_tokenizer.decode(tokens)
print(f"Decoded text: {decoded_text}")

# Simple token counting
token_count = cl100k_tokenizer.count(text)
print(f"Token count: {token_count}")

Efficient Token Limiting

One of the key features is the ability to efficiently count tokens up to a limit, which is useful when you need to stay within token constraints:

from c_bpe.bpe import openai

tokenizer = openai.cl100k_base()
max_tokens = 50

# Count tokens until limit is reached
text = "This is a long text that might exceed our token limit... " * 20
char_position = tokenizer.count_till_limit(text, max_tokens)

if char_position is not None:
    # We reached the limit before the end of the text
    truncated_text = text[:char_position]
    print(f"Truncated to {tokenizer.count(truncated_text)} tokens")
    print(f"Truncated text: {truncated_text}")
else:
    # The entire text is within our token limit
    print(f"Text is within token limit: {tokenizer.count(text)} tokens")

Batch Processing

c_bpe excels at batch processing, which is perfect for processing large datasets:

from c_bpe.bpe import openai
import time

# Load the tokenizer
tokenizer = openai.cl100k_base()

# Create a batch of texts
texts = [
    "This is the first document to encode.",
    "Here's another one with different content.",
    "A third document with some more text to process.",
    # Add more as needed...
]

# Configure parallel processing options (optional)
parallel_options = openai.ParallelOptions(
    min_batch_size=20,      # Minimum batch size to engage parallel processing
    chunk_size=100,         # Number of texts to process in each thread
    max_threads=0,          # 0 means use optimal thread count (based on CPU cores)
    use_thread_pool=True    # Reuse thread pool for better performance
)

# Encode batch with performance metrics
start_time = time.time()
result = tokenizer.encode_batch(texts, parallel_options)
end_time = time.time()

print(f"Processed {len(texts)} texts in {result.time_taken:.6f}s")
print(f"Total tokens: {result.total_tokens}")
print(f"Throughput: {result.total_tokens / result.time_taken:.1f} tokens/second")

# Access individual token lists
for i, tokens in enumerate(result.tokens):
    print(f"Text {i} has {len(tokens)} tokens")

Text Chunking

c_bpe can be used to efficiently chunk text based on token counts:

from c_bpe.bpe import openai

tokenizer = openai.cl100k_base()

def chunk_text(text, max_chunk_tokens=1024, overlap_tokens=50):
    """Split text into chunks of approximately max_chunk_tokens."""
    chunks = []

    # Get the full text token count
    total_tokens = tokenizer.count(text)

    if total_tokens <= max_chunk_tokens:
        return [text]

    # Keep track of where we are in the text
    start_pos = 0

    while start_pos < len(text):
        # Find where to end this chunk
        char_position = tokenizer.count_till_limit(text[start_pos:], max_chunk_tokens)

        if char_position is None:
            # The rest of the text fits within our limit
            chunks.append(text[start_pos:])
            break

        # Add the chunk
        end_pos = start_pos + char_position
        chunks.append(text[start_pos:end_pos])

        # Move to the next chunk, considering overlap
        if overlap_tokens > 0 and end_pos < len(text):
            # Move back by overlap tokens
            overlap_char_position = tokenizer.count_till_limit(
                text[start_pos:end_pos], max_chunk_tokens - overlap_tokens
            )
            if overlap_char_position is not None:
                start_pos += overlap_char_position
            else:
                start_pos = end_pos
        else:
            start_pos = end_pos

    return chunks

# Example usage
long_text = "This is a long document that needs to be split into chunks. " * 100
chunks = chunk_text(long_text, max_chunk_tokens=100, overlap_tokens=10)

print(f"Split text into {len(chunks)} chunks:")
for i, chunk in enumerate(chunks):
    token_count = tokenizer.count(chunk)
    print(f"Chunk {i}: {token_count} tokens, {len(chunk)} chars")

Building from Source

Prerequisites

Requirement c_bpe rs_bpe (companion)
Python ≥ 3.9
C11 compiler (GCC, Clang, or MSVC)
Rust toolchain (stable)
setuptools (pip install setuptools)
maturin (pip install maturin)

c_bpe (C extension)

# Clone the repository
git clone https://github.com/andrey-savov/c-bpe.git
cd c-bpe

# Create and activate a virtual environment (recommended)
python -m venv .venv
source .venv/bin/activate   # Linux/macOS
# .venv\Scripts\activate    # Windows

# Install in development mode (editable)
pip install -e .

# Or build the extension in-place without installing
python setup.py build_ext --inplace

The build auto-detects the compiler and applies platform-appropriate optimisations:

  • GCC/Clang: -O3 -march=native -flto -DNDEBUG
  • MSVC: /O2 /Ox /GL /DNDEBUG with /LTCG at link time

PCRE2 Unicode tables are bundled in third_party/; no external PCRE2 installation is required.

rs_bpe (Rust companion — for benchmarking)

The rust/ directory contains the original Rust implementation (rs-bpe) for comparison benchmarking:

cd rust

# Install maturin if not already present
pip install maturin

# Build and install in development mode
maturin develop --release

The Rust toolchain can be installed from rustup.rs.

Installing both side by side

Both packages can be installed in the same environment — they use separate namespaces (c_bpe and rs_bpe):

cd c-bpe
pip install -e .                                    # c_bpe
cd rust && pip install maturin && maturin develop --release   # rs_bpe

Verify:

from c_bpe.bpe import openai as c_openai
from rs_bpe.bpe import openai as rs_openai

c_tok  = c_openai.cl100k_base()
rs_tok = rs_openai.cl100k_base()

text = "Hello, world!"
assert c_tok.encode(text) == rs_tok.encode(text)
print("Both implementations installed and producing identical output.")

Running tests

# From the repository root, with both implementations installed:
pip install pytest pytest-benchmark

# Correctness tests
pytest tests/test_basic.py -v

# Benchmarks
pytest tests/test_benchmarks.py --benchmark-only -v

Acknowledgements

This project was developed with the assistance of Claude Code, using Claude Opus 4.6 and Claude Sonnet 4.6 models by Anthropic.

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

c_bpe-1.0.3.tar.gz (35.0 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

c_bpe-1.0.3-cp313-cp313-win_amd64.whl (31.3 MB view details)

Uploaded CPython 3.13Windows x86-64

c_bpe-1.0.3-cp313-cp313-manylinux_2_28_x86_64.whl (31.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

c_bpe-1.0.3-cp313-cp313-macosx_11_0_arm64.whl (31.4 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

c_bpe-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl (31.3 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

c_bpe-1.0.3-cp312-cp312-win_amd64.whl (31.3 MB view details)

Uploaded CPython 3.12Windows x86-64

c_bpe-1.0.3-cp312-cp312-manylinux_2_28_x86_64.whl (31.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

c_bpe-1.0.3-cp312-cp312-macosx_11_0_arm64.whl (31.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

c_bpe-1.0.3-cp312-cp312-macosx_10_13_x86_64.whl (31.3 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

c_bpe-1.0.3-cp311-cp311-win_amd64.whl (31.3 MB view details)

Uploaded CPython 3.11Windows x86-64

c_bpe-1.0.3-cp311-cp311-manylinux_2_28_x86_64.whl (31.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

c_bpe-1.0.3-cp311-cp311-macosx_11_0_arm64.whl (31.4 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

c_bpe-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl (31.3 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

c_bpe-1.0.3-cp310-cp310-win_amd64.whl (31.3 MB view details)

Uploaded CPython 3.10Windows x86-64

c_bpe-1.0.3-cp310-cp310-manylinux_2_28_x86_64.whl (31.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

c_bpe-1.0.3-cp310-cp310-macosx_11_0_arm64.whl (31.4 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

c_bpe-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl (31.3 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

c_bpe-1.0.3-cp39-cp39-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.9Windows x86-64

c_bpe-1.0.3-cp39-cp39-manylinux_2_28_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

c_bpe-1.0.3-cp39-cp39-macosx_11_0_arm64.whl (31.4 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

c_bpe-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file c_bpe-1.0.3.tar.gz.

File metadata

  • Download URL: c_bpe-1.0.3.tar.gz
  • Upload date:
  • Size: 35.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for c_bpe-1.0.3.tar.gz
Algorithm Hash digest
SHA256 aafc4006835aa818d9ab35602186e0cb4d9180acf8f0274ae86182fb69b35a80
MD5 fd441010de3641fc7f5fa7207b4fc12a
BLAKE2b-256 85638f29b3e03b67ec2ed7b5e76509c764d6966891de2d5c92cf612c1f7fa989

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3.tar.gz:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: c_bpe-1.0.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 31.3 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for c_bpe-1.0.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7dad8178039c9842750980f8fc5eb69a2c557a07bf82c5e66d5dde504100fbdd
MD5 3f38778e874cb08cec7c79042fad32aa
BLAKE2b-256 34482dfa7d30023574da2b090783ccee03fb8b7945166e181d7136abc55872de

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp313-cp313-win_amd64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6c885bac76302af5c8c1b5014158c4365497c0def22ba2a39843657a1ff7088a
MD5 4a5acd75246604f9fb4af9419e263cbb
BLAKE2b-256 ac2be6c30f2caa646eca0472da677e3f14e716b000d237eeab10f6100541663d

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4472d97b89f0077ebefc9e8b0501ee542de4b33246f6b26437a3a38e1af60a08
MD5 cf40482c5239bb6a6250ca7b9319ab30
BLAKE2b-256 bfe855f93102405ce2319c0c5893a11a1246eb69df7b72d80b704c43b0f8a5f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 ea8c4a5472fe8b4c0cdf3ae7b5897fe949db0ad1bc476f84b71c0d1efe86199b
MD5 11b24a47996224aafcc6b6123c24bbca
BLAKE2b-256 0d2b817c8c73a0bcc5a543624e88e1b6736abd5938e58b446a2b625ba206963b

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: c_bpe-1.0.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 31.3 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for c_bpe-1.0.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e6804c86ff182c370b2167b497537c346499d5f1b1b05ec4416e3a62facbf7d3
MD5 880190974f0a984b6aae054b5a9fcafd
BLAKE2b-256 07b08f654fbd046effffc57e399aef8b50a207d3a211f487038c933074662065

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp312-cp312-win_amd64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0d82c04572b0141940ef38342b5323bf7bc22393c86b891224722c520a87503c
MD5 f520b227889fff291db5a60117a21bba
BLAKE2b-256 1ebade77df158e7367a16cce458bbdc4a683486d5e7394c4548a576706001e0c

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 476426fc506e07b9a82e71c9e550afd142d36ec9134059658826214e2c36e484
MD5 e6111f24d535f5aa35ce0b97acc807ce
BLAKE2b-256 6824bc918a124f8765fdabc71607611f3a096f72ec3adaaf628fa4c1f5ef0a70

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e7d5d2457d3b92a692e07aeaf3b9dabbcb6d481eb98ed76b7c05403454e4b92e
MD5 e22d11a74ca8b34e1f4f00d55da73b60
BLAKE2b-256 1f23d1898f42bba8a6c9795dff30b681b89ed2c0c5e362a393333add5838b1ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: c_bpe-1.0.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 31.3 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for c_bpe-1.0.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3d59391e6b581ed27b40d5cd787deb94a4a57b2770e6ac206449698b59258976
MD5 386d004a469ef41c8ec409e1c977ccde
BLAKE2b-256 4b59c94c2e7405c0e28264fe7b62a811ed5d9c677b5cdae883c58374e2bb61bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp311-cp311-win_amd64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e2116ca5562f69bac20414e178db86f2b9151e2b1fd1031a1ca3415d3e9ae8ff
MD5 f6a754a82bdac3a0b24b3f99dbcc5c6b
BLAKE2b-256 d539bff4f27b682945c2b747c7279233bed39a2c8d6825e551a38e33d57183fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 953d78286f963d27fa87e36995606cc7d5631da0b49b16292644af5ccb7cdd86
MD5 a40e90e5d1e6f333edf041e336ffce9d
BLAKE2b-256 389a6a003faf6fa5f35b8d52854c76b95c718648094a71e91ffc61a9d45365e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5d5d6fd272d717e96722633a366647a26e05c9481a224498a5d093507133de12
MD5 e249cfc600094918045abc1304633cad
BLAKE2b-256 347212a99d6a46c5e2591b7254841622e7604206f9a16d23458ca9c7bb1f643d

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: c_bpe-1.0.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 31.3 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for c_bpe-1.0.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 24975fe3b3ff05b061a82b4bf2a796c5d1700dbf1c8ae7c9e9888c244911262b
MD5 1841fb594bcac203d5e5d42970d0c527
BLAKE2b-256 b27e424eff4004373c9a2b6df160a2cde7237766294943cb08da95cf46e38333

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp310-cp310-win_amd64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1eb10807c6c7d701a487876cc12e2e7308a2f362dafc894cd4324e160b75f7dd
MD5 6d8ee9534bcf3ad3144dfbef6bb59262
BLAKE2b-256 79fb18a0fa57be56c48906f63955080048e4eab873b3f47e47a0c02d568b8855

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp310-cp310-manylinux_2_28_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2ca49e80ba330823374514f2799870d912dd87233e8f366aa42f409aaba95a72
MD5 f610a60a2615894669954b5b6c48b0c1
BLAKE2b-256 cba741b5bf7883512ff3a74d8c4f2ea824aea0221186308a7af2132f684c6321

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 cae74b4121530b2bdca889c455384bf86332fa858ef384298a27e0b81e42baba
MD5 7d579f284f6d83d78891d0bfba33275b
BLAKE2b-256 7974197cd58514f251a96e4defa3b345c2928ca5f87d03aa53982b19bacfbf88

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: c_bpe-1.0.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for c_bpe-1.0.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 cb46e77badb538f0378ee6ad59976b59674c13c1280248d046d63e9cf6e60cca
MD5 341aed9b8f2fcc088ca17d2bbf060095
BLAKE2b-256 4faf188ecf2329a392d81eff5ca8b6c5c75ce11e3008e0e61a431d8f1547521e

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp39-cp39-win_amd64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8826a65c6414c491fbe59e8ee6997f491d8cec865da22b5ac3f3c9d31fc3a73d
MD5 08f00776bfa07fa2a76cfeec3f680db3
BLAKE2b-256 308bc38f82185a3d9ecf46b76f4c1ee4b088968979edc365727063354441b365

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp39-cp39-manylinux_2_28_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: c_bpe-1.0.3-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 31.4 MB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for c_bpe-1.0.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7169f0da82008e0a64458c0e4f668677004268e0f4dd901aede86b1f583029dd
MD5 a4d876632c9cbdd82cedc73339838e9a
BLAKE2b-256 46afa6038581ba3a7a21af00ce635977314e16efd301e472b9054bf9f599deb6

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_bpe-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for c_bpe-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c71e79deb342060a68879103dced81d0422be1128d7c00af6a8abb70107f9a27
MD5 ff101e8cd6defb65f5587d236619445f
BLAKE2b-256 f70aae5e8968597e9246dba1e0f30525a88847ed8dc1751c8e71a0c745e07ea1

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_bpe-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl:

Publisher: release.yml on andrey-savov/c-bpe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page