Getting started¶
pybase64 is a wrapper on libbase64.
It aims to provide a fast base64 implementation for base64 encoding/decoding.
Installation¶
pip install pybase64
Usage¶
pybase64 uses the same API as Python base64 “modern interface” (introduced in Python 2.4) for an easy integration.
To get the fastest decoding, it is recommended to use the b64decode() and validate=True when possible.
import pybase64
print(pybase64.b64encode(b'>>>foo???', altchars='_:'))
# b'Pj4_Zm9vPz8:'
print(pybase64.b64decode(b'Pj4_Zm9vPz8:', altchars='_:', validate=True))
# b'>>>foo???'
# Standard encoding helpers
print(pybase64.standard_b64encode(b'>>>foo???'))
# b'Pj4+Zm9vPz8/'
print(pybase64.standard_b64decode(b'Pj4+Zm9vPz8/'))
# b'>>>foo???'
# URL safe encoding helpers
print(pybase64.urlsafe_b64encode(b'>>>foo???'))
# b'Pj4-Zm9vPz8_'
print(pybase64.urlsafe_b64decode(b'Pj4-Zm9vPz8_'))
# b'>>>foo???'
Check API Reference for more details.
A command-line tool is also provided. It has encode, decode and benchmark subcommands.
usage: pybase64 [-h] [-V] {benchmark,encode,decode} ...
pybase64 command-line tool.
positional arguments:
{benchmark,encode,decode}
tool help
benchmark -h for usage
encode -h for usage
decode -h for usage
optional arguments:
-h, --help show this help message and exit
-V, --version show program's version number and exit
Benchmark¶
Running Python 3.15.0a8, Apple clang version 21.0.0 (clang-2100.0.123.102), macOS 26.3.1, Apple M1 Max
pybase64 1.5.0 (C extension active - NEON)
bench: altchars=None, validate=True, padded=True
pybase64.encodebytes: 5129 MB/s (135,696 bytes -> 183,309 bytes)
pybase64.b64encode: 16339 MB/s (135,696 bytes -> 180,928 bytes)
pybase64.b64decode: 8821 MB/s (180,928 bytes -> 135,696 bytes)
base64.encodebytes: 2339 MB/s (135,696 bytes -> 183,309 bytes)
base64.b64encode: 2642 MB/s (135,696 bytes -> 180,928 bytes)
base64.b64decode: 2613 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, validate=True, padded=False
pybase64.b64encode: 16369 MB/s (135,696 bytes -> 180,928 bytes)
pybase64.b64decode: 2480 MB/s (180,928 bytes -> 135,696 bytes)
base64.b64encode: 2573 MB/s (135,696 bytes -> 180,928 bytes)
base64.b64decode: 2583 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'', padded=False
pybase64.b64decode: 2478 MB/s (180,928 bytes -> 135,696 bytes)
base64.b64decode: 2610 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'\n', padded=True
pybase64.b64decode: 2338 MB/s (183,308 bytes -> 135,696 bytes)
base64.b64decode: 2083 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'\n', padded=False
pybase64.b64decode: 2337 MB/s (183,308 bytes -> 135,696 bytes)
base64.b64decode: 2013 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, validate=False, padded=True
pybase64.b64decode: 2356 MB/s (183,308 bytes -> 135,696 bytes)
base64.b64decode: 2156 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, validate=False, padded=False
pybase64.b64decode: 2332 MB/s (183,308 bytes -> 135,696 bytes)
base64.b64decode: 2079 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=True, padded=True
pybase64.b64encode: 10328 MB/s (135,696 bytes -> 180,928 bytes)
pybase64.b64decode: 5861 MB/s (180,928 bytes -> 135,696 bytes)
base64.b64encode: 2617 MB/s (135,696 bytes -> 180,928 bytes)
base64.b64decode: 1183 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=True, padded=False
pybase64.b64encode: 10344 MB/s (135,696 bytes -> 180,928 bytes)
pybase64.b64decode: 2163 MB/s (180,928 bytes -> 135,696 bytes)
base64.b64encode: 2625 MB/s (135,696 bytes -> 180,928 bytes)
base64.b64decode: 1164 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'', padded=True
pybase64.b64decode: 5815 MB/s (180,928 bytes -> 135,696 bytes)
base64.b64decode: 2598 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'', padded=False
pybase64.b64decode: 2146 MB/s (180,928 bytes -> 135,696 bytes)
base64.b64decode: 2586 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'\n', padded=True
pybase64.b64decode: 2042 MB/s (183,308 bytes -> 135,696 bytes)
base64.b64decode: 2056 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'\n', padded=False
pybase64.b64decode: 2034 MB/s (183,308 bytes -> 135,696 bytes)
base64.b64decode: 1952 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=False, padded=True
pybase64.b64decode: 2021 MB/s (183,308 bytes -> 135,696 bytes)
base64.b64decode: 1063 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=False, padded=False
pybase64.b64decode: 2014 MB/s (183,308 bytes -> 135,696 bytes)
base64.b64decode: 1042 MB/s (183,308 bytes -> 135,696 bytes)