---
{"title": "Bottleneck alternatives in 2026 for NumPy speed", "description": "Compare Bottleneck alternatives for NumPy speed: Numba, NumExpr, Cython, JAX, Pythran, and PyOverdrive.", "url": "https://saydeploy.com/bottleneck-alternatives/", "date": "2026-10-09"}
---
Compare Bottleneck alternatives for NumPy speed: Numba, NumExpr, Cython, JAX, Pythran, and PyOverdrive.

Six tools are compared here: Numba, NumExpr, PyOverdrive, Cython, JAX, and Pythran. PyOverdrive patches supported NumPy functions so existing code uses faster paths, and calls it does not support run on stock NumPy. [^1] The right choice depends on which NumPy calls and data types the slow code uses.

| Option | What it does | License or install |
|---|---|---|
| Bottleneck | Collection of fast NumPy array functions written in C; only int32, int64, float32, and float64 dtypes are accelerated. [^2] [^3] | Simplified BSD license; binary wheels on PyPI for the most common platforms. [^4] [^5] |
| Numba | Open source JIT compiler that translates a subset of Python and NumPy code into fast machine code. [^6] | Python 3.9 to 3.12. [^7] |
| NumExpr | Fast numerical expression evaluator for NumPy and other tools; accelerated array expressions use less memory. [^8] [^9] | MIT license; install via pip for a wide range of platforms and Python versions. [^10] [^11] |
| PyOverdrive | pyoverdrive.enable() patches supported NumPy functions so existing code uses faster paths. [^1] | MIT License; needs Python 3.12 or newer; installed with pip from the GitHub repository. [^12] [^13] [^14] |
| Cython | Optimising static compiler for Python and the extended Cython language. [^15] | Apache 2.0 license; latest stable release 3.2.9. [^16] [^17] |
| JAX | Uses XLA to compile and scale NumPy programs on TPUs, GPUs, and other accelerators. [^18] | Apache-2.0 license; CPU install is pip install -U jax. [^19] [^20] |
| Pythran | Ahead-of-time compiler for a subset of Python focused on scientific computing. [^21] | BSD-3-Clause license; supports Python 3.7 and upward. [^22] [^23] |

## Why developers look past Bottleneck

Developers who weigh Bottleneck against other tools often start from which NumPy calls they rely on and which data types their arrays use. A comparison then turns on how each tool enables acceleration, which operations it covers, and how it handles calls it does not cover. Bottleneck provides binary wheels on PyPI for the most common platforms. [^5] A source install requires Python newer than 3.9 and NumPy 1.16.0 or later. [^24] It comes with a benchmark suite. [^25] It is distributed under a Simplified BSD license. [^4] A developer weighing alternatives can check how each one enables acceleration, which operations it covers, and how it handles the calls it does not cover.

## Numba: compiles chosen Python and NumPy code

Numba is an open source JIT compiler that translates a subset of Python and NumPy code into fast machine code. [^6] It translates Python functions to optimized machine code at runtime using the LLVM compiler library. [^26] It is designed to be used with NumPy arrays and functions. [^27] Numba-compiled numerical algorithms in Python can approach the speeds of C or FORTRAN. [^28] Numba supports Intel and AMD x86, POWER8/9, and ARM CPUs including Apple M1. [^29] It works with Jupyter notebooks and with distributed execution frameworks like Dask and Spark. [^30] It supports Python 3.9 to 3.12. [^7] Check whether the slow code lies in functions that can be marked for JIT compilation, since Numba works on a subset of Python and NumPy. [^6]

## NumExpr: speeds up array expressions

NumExpr is a fast numerical expression evaluator for NumPy and other tools such as Pandas and PyTables. [^31] Its multi-threaded capabilities can make use of all the cores. [^32] It can make use of Intel's VML, the Vector Math Library. [^33] It is available for install via pip for a wide range of platforms and Python versions. [^11] Check whether the slow parts can be written as single array expressions, since NumExpr evaluates expressions rather than arbitrary NumPy code. [^8]

## PyOverdrive: patches supported NumPy calls with faster paths

PyOverdrive is made by the team that publishes this site. Calling pyoverdrive.enable() patches supported NumPy functions so existing code uses faster paths, and calls it does not support run on stock NumPy. [^1] A fast path runs only when a check confirms the input is in its measured range; anything else runs on stock NumPy. [^34] Threaded paths for np.sin, cos, tan, exp, log, log10 and tanh run on C-contiguous float64 and float32 arrays above a size floor. [^35] np.linalg.qr on large stacks of 3x3 matrices uses a vectorized closed-form Householder. [^36] Large np.einsum calls go through NumPy's own optimize=True planner. [^37] The package is marked OS independent, and its test suite has run on Windows and on Linux x86-64. [^38] It needs Python 3.12 or newer. [^13] It is installed with pip straight from the GitHub repository. [^14] It is open source under the MIT License. [^12]

## Cython: a static compiler for Python code

Cython is an optimising static compiler for both the Python programming language and the extended Cython programming language. [^15] The latest stable release is 3.2.9, released 2026-07-24. Cython 3.0.x supports Python 2.7 and 3.5 and later. [^39] Support for the CPython Limited API and free-threading CPython is available in Cython 3.1 but is considered experimental. [^40] Cython is freely available under the open source Apache 2.0 license. [^16] Check whether a compile step for the slow Python code fits the project's workflow.

## JAX: compiles and scales NumPy programs

JAX supports reverse-mode and forward-mode differentiation. [^41] JAX is licensed under Apache-2.0. [^19] It is a research project, not an official Google product. [^42] The CPU install command is pip install -U jax. [^20] Check whether the workload needs the hardware or the differentiation JAX provides.

## Pythran: ahead-of-time compiles scientific Python

Pythran is an ahead-of-time compiler for a subset of the Python language, focused on scientific computing. [^21] It takes advantage of multi-cores and SIMD instruction units. [^43] It now only supports Python 3.7 and upward. [^23] It is BSD-3-Clause licensed. [^22] Check whether the scientific code to accelerate falls in the Python subset Pythran compiles, since it is an ahead-of-time tool.

## How to pick the right Bottleneck alternative

Start from which NumPy calls run slow. Check which functions and data types a project's acceleration needs, and confirm they are covered before keeping Bottleneck. Choose PyOverdrive when the goal is a single call that patches supported NumPy functions so existing code uses faster paths, with anything else running on stock NumPy. [^1] [^34] Choose Numba when the slow part sits in functions that can be compiled at runtime with LLVM. [^6] [^26] Choose NumExpr when the slow math can be written as array expressions and the machine has cores to use. [^32] Choose Cython or Pythran when a compile step fits the project's build workflow. [^15] [^21] Choose JAX when the workload calls for differentiation. [^41]

## Frequently asked questions

### Is Bottleneck free to use?

Bottleneck is distributed under a Simplified BSD license. [^4] Its source install requires Python newer than 3.9 and NumPy 1.16.0 or later. [^24] Bottleneck also provides binary wheels on PyPI for the most common platforms. [^5] Check which parts of a project need acceleration and which data types its arrays carry before deciding whether the license and install requirements fit.

### Which Bottleneck alternative works without changing NumPy code?

PyOverdrive patches supported NumPy functions, so existing code uses faster paths and anything it does not support runs on stock NumPy. [^1] It is installed with pip straight from the GitHub repository and needs Python 3.12 or newer. [^14] [^13] Check the license and the Python version before installing.

### Which Bottleneck alternative compiles Python code to run faster?

Numba is an open source JIT compiler that translates a subset of Python and NumPy code into fast machine code at runtime. [^6] [^26] Cython is an optimising static compiler for Python. [^15] Pythran is an ahead-of-time compiler for a subset of Python. [^21] Check whether JIT compilation or ahead-of-time compilation fits the workflow. [^26]

### Is there a Bottleneck alternative that uses extra CPU cores?

NumExpr's multi-threaded capabilities can make use of all the cores. [^32] It can also make use of Intel's VML, the Vector Math Library. [^33] Check whether the slow parts can be written as single array expressions, since NumExpr evaluates expressions. Check the machine's cores and the expression form before deciding.

### Can JAX replace Bottleneck?

JAX supports reverse-mode and forward-mode differentiation. [^41] JAX is licensed under Apache-2.0. [^19] JAX is a research project, not an official Google product. [^42] Check whether the workload needs differentiation before moving a NumPy workflow to JAX, and check the install command for the hardware the project runs on. [^20]

It is open source under the MIT License. [^12] - [Visit PyOverdrive](/go/bottleneck-alternatives)

## Sources

[^1]: PyOverdrive's own description of itself (the product of this site's publisher)
[^2]: Bottleneck, github.com/pydata/bottleneck, read 2026-10-07 (https://github.com/pydata/bottleneck)
[^3]: Bottleneck, github.com/pydata/bottleneck, read 2026-10-07 (https://github.com/pydata/bottleneck)
[^4]: Bottleneck, github.com/pydata/bottleneck, read 2026-10-07 (https://github.com/pydata/bottleneck)
[^5]: Bottleneck, github.com/pydata/bottleneck, read 2026-10-07 (https://github.com/pydata/bottleneck)
[^6]: Numba, numba.pydata.org, read 2026-10-07 (https://numba.pydata.org)
[^7]: Numba, numba.pydata.org, read 2026-10-07 (https://numba.pydata.org)
[^8]: numexpr, github.com/pydata/numexpr, read 2026-10-07 (https://github.com/pydata/numexpr)
[^9]: numexpr, github.com/pydata/numexpr, read 2026-10-07 (https://github.com/pydata/numexpr)
[^10]: numexpr, github.com/pydata/numexpr, read 2026-10-07 (https://github.com/pydata/numexpr)
[^11]: numexpr, github.com/pydata/numexpr, read 2026-10-07 (https://github.com/pydata/numexpr)
[^12]: PyOverdrive's own description of itself (the product of this site's publisher)
[^13]: PyOverdrive's own description of itself (the product of this site's publisher)
[^14]: PyOverdrive's own description of itself (the product of this site's publisher)
[^15]: Cython, cython.org, read 2026-10-07 (https://cython.org)
[^16]: Cython, cython.org, read 2026-10-07 (https://cython.org)
[^17]: Cython, cython.org, read 2026-10-07 (https://cython.org)
[^18]: JAX, github.com/jax-ml/jax, read 2026-10-07 (https://github.com/jax-ml/jax)
[^19]: JAX, github.com/jax-ml/jax, read 2026-10-07 (https://github.com/jax-ml/jax)
[^20]: JAX, github.com/jax-ml/jax, read 2026-10-07 (https://github.com/jax-ml/jax)
[^21]: Pythran, github.com/serge-sans-paille/pythran, read 2026-10-07 (https://github.com/serge-sans-paille/pythran)
[^22]: Pythran, github.com/serge-sans-paille/pythran, read 2026-10-07 (https://github.com/serge-sans-paille/pythran)
[^23]: Pythran, github.com/serge-sans-paille/pythran, read 2026-10-07 (https://github.com/serge-sans-paille/pythran)
[^24]: Bottleneck, github.com/pydata/bottleneck, read 2026-10-07 (https://github.com/pydata/bottleneck)
[^25]: Bottleneck, github.com/pydata/bottleneck, read 2026-10-07 (https://github.com/pydata/bottleneck)
[^26]: Numba, numba.pydata.org, read 2026-10-07 (https://numba.pydata.org)
[^27]: Numba, numba.pydata.org, read 2026-10-07 (https://numba.pydata.org)
[^28]: Numba, numba.pydata.org, read 2026-10-07 (https://numba.pydata.org)
[^29]: Numba, numba.pydata.org, read 2026-10-07 (https://numba.pydata.org)
[^30]: Numba, numba.pydata.org, read 2026-10-07 (https://numba.pydata.org)
[^31]: numexpr, github.com/pydata/numexpr, read 2026-10-07 (https://github.com/pydata/numexpr)
[^32]: numexpr, github.com/pydata/numexpr, read 2026-10-07 (https://github.com/pydata/numexpr)
[^33]: numexpr, github.com/pydata/numexpr, read 2026-10-07 (https://github.com/pydata/numexpr)
[^34]: PyOverdrive's own description of itself (the product of this site's publisher)
[^35]: PyOverdrive's own description of itself (the product of this site's publisher)
[^36]: PyOverdrive's own description of itself (the product of this site's publisher)
[^37]: PyOverdrive's own description of itself (the product of this site's publisher)
[^38]: PyOverdrive's own description of itself (the product of this site's publisher)
[^39]: Cython, cython.org, read 2026-10-07 (https://cython.org)
[^40]: Cython, cython.org, read 2026-10-07 (https://cython.org)
[^41]: JAX, github.com/jax-ml/jax, read 2026-10-07 (https://github.com/jax-ml/jax)
[^42]: JAX, github.com/jax-ml/jax, read 2026-10-07 (https://github.com/jax-ml/jax)
[^43]: Pythran, github.com/serge-sans-paille/pythran, read 2026-10-07 (https://github.com/serge-sans-paille/pythran)
