You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
nanobind is a small binding library that exposes C++ types in Python and vice
versa. It is reminiscent of
Boost.Python and
pybind11 and uses near-identical syntax.
In contrast to these existing tools, nanobind is more efficient: bindings
compile in a shorter amount of time, produce smaller binaries, and have better
runtime performance.
More concretely,
benchmarks show up
to ~4× faster compile time, ~5× smaller binaries, and ~10× lower
runtime overheads compared to pybind11. nanobind also outperforms Cython in
important metrics (3-12× binary size reduction, 1.6-4× compilation time
reduction, similar runtime performance).
Testimonials
A selection of testimonials from projects that migrated from pybind11 to nanobind.
"IREE and its derivatives switched 1.5 years ago. It has been one of the single best dep decisions I've made. Not only is it much-much faster to compile, it produces smaller binaries and has a much more lean interface to the underlying Python machinery that all adds up to significant performance improvements. Worked exactly like it said on the tin."
"For a complicated Google-internal LLM model in JAX, this change improves the MLIR lowering time by around 5s (out of around 30s), which is a significant speedup for simply switching binding frameworks."
"MLX uses nanobind to bind C++ to Python. It's a critical piece of MLX infra and is why running Python code is nearly the same speed as running C++ directly. Also makes it super easy to move arrays between frameworks."
"nanobind has a number of advantages, notably speed of compilation and dispatch, but the main reason to do this for these bindings is because nanobind can target the Python Stable ABI starting with Python 3.12. This means that we will not need to ship per-Python version CUDA plugins starting with Python 3.12."
"nanobind is smaller than pybind11, the wrappers build faster and it has significantly improved support for wrapping multi-dimensional arrays, which we use heavily. The nanobind docs are easier to follow on the low-level details, which makes understanding the memory management in the wrapper layer easier."
"Nanobind has been developed as a natural successor to the pybind11 library and offers a number of advantages like its ability to target Python's Stable ABI."
Documentation
Please see the following links for tutorial and reference documentation in
HTML and
PDF formats.
License and attribution
All material in this repository is licensed under a three-clause BSD
license.
Please use the following BibTeX template to cite nanobind in scientific
discourse:
@misc{nanobind,
author = {Wenzel Jakob},
year = {2022},
note = {https://github.com/wjakob/nanobind},
title = {nanobind: tiny and efficient C++/Python bindings}
}