---
{"title": "Numba alternatives in 2026 for NumPy code", "description": "Compare Numba alternatives for faster NumPy code: expression evaluators, compilers, focused array libraries, and PyOverdrive.", "url": "https://saydeploy.com/numba-alternatives/", "date": "2026-10-17"}
---
Compare Numba alternatives for faster NumPy code: expression evaluators, compilers, focused array libraries, and PyOverdrive.

Compare Numba alternatives for speeding up NumPy code: expression evaluators like NumExpr, compilers like Cython and Pythran, focused array libraries like Bottleneck, hardware-compiling JAX, and PyOverdrive. Each works differently, so the right choice depends on whether the code is whole expressions, written in an extended language, run on another accelerator, or best kept on stock NumPy with faster paths where supported.

| Option | What it does | Platforms or install |
|---|---|---|
| Numba | JIT compiler that translates a subset of Python and NumPy code into fast machine code. [^1] | Supports Python 3.9-3.12. [^1] |
| NumExpr | Fast numerical expression evaluator for NumPy. [^2] | Available via pip for a wide range of platforms and Python versions. [^2] |
| Cython | Optimising static compiler for Python and the extended Cython language. [^3] | Cython 3.0.x supports Python 2.7 and 3.5 and later. [^3] |
| Bottleneck | Collection of fast NumPy array functions written in C. [^4] | Provides binary wheels for the most common platforms. [^4] |
| JAX | Compiles and scales NumPy programs on TPUs, GPUs and other hardware accelerators. [^5] | CPU install: pip install -U jax. [^5] |
| Pythran | Ahead-of-time compiler for a subset of Python focused on scientific computing. [^6] | Supports Python 3.7 and upward. [^6] |
| PyOverdrive | Patches supported NumPy functions so existing code uses faster paths. [^7] | Installed with pip from the GitHub repository; needs Python 3.12 or newer. [^7] [^7] |

## Why developers look past Numba

Developers look past Numba for reasons tied to how it works. Numba is an open source JIT compiler that translates a subset of Python and NumPy code into fast machine code. [^1] The subset it translates is limited, so check whether your code falls inside that subset. [^1] Numba-compiled numerical algorithms in Python can approach the speeds of C or FORTRAN. [^1]

It supports NVIDIA CUDA for writing parallel GPU algorithms from Python, and it supports Intel and AMD x86, POWER8/9, and ARM CPUs including Apple M1. [^1] [^1] A developer on a runtime outside the supported range, or on code outside the supported subset, can check what each alternative covers.

## NumExpr: evaluates whole array expressions

NumExpr is a fast numerical expression evaluator for Python, NumPy, Pandas, PyTables and more. [^2] It is distributed under the MIT license. [^2] NumExpr is available for install via pip for a wide range of platforms and Python versions. [^2] Check whether the slow code fits the array-expression style NumExpr evaluates, and what the setup needs.

## Cython: an optimising static compiler

Cython is an optimising static compiler for both the Python programming language and the extended Cython programming language. [^3] It is freely available under the open source Apache 2.0 License. [^3] The latest stable release of Cython is 3.2.9, released 2026-07-24. [^3] Check how much of the NumPy code can be written in the extended Cython language, since that decides what the compiler speeds up.

## Bottleneck: fast array functions written in C

Bottleneck provides binary wheels for the most common platforms. [^4] It is distributed under a Simplified BSD license. [^4] A source install requires Python above 3.9 and NumPy 1.16.0 or newer. [^4] Check whether your arrays' types and shapes are the ones the functions handle.

## JAX: compiles NumPy programs on other hardware

It is licensed under Apache-2.0. [^5] The CPU install command is pip install -U jax. [^5] Check whether the code matches the NumPy-style interface and whether the target hardware matches the workload.

## Pythran: ahead-of-time compile for scientific code

Pythran is an ahead of time compiler for a subset of the Python language, with a focus on scientific computing. [^6] Pythran is BSD-3-Clause licensed. [^6] Because it compiles a subset of Python ahead of time, check whether the code that needs speed sits inside that subset and the runtime is supported.

## PyOverdrive: patches NumPy functions to use faster paths

PyOverdrive is made by the team that publishes this site. Calling pyoverdrive.enable() patches supported NumPy functions so your existing code uses faster paths, and calls it does not support run on stock NumPy. [^7] A fast path runs only when a check confirms the input is in its measured range; anything else, or a fast path that raises an error, goes to stock NumPy. [^7] The package is marked OS independent, and the test suite has been run on Windows and on Linux x86-64. [^7] It needs Python 3.12 or newer. [^7] You install it with pip straight from the GitHub repository. [^7] It is open source under the MIT License. [^7] The version is 1.0.0 and its status is Beta. [^7]

## How to pick the right Numba alternative

Choose NumExpr when the slow part is a numerical array expression that NumExpr evaluates. [^2]

Choose Cython when the code can be written in the extended Cython language, since Cython compiles it ahead of time. [^3]

Choose Bottleneck when a prebuilt binary wheel for the most common platforms fits the project's setup. [^4] Check whether your arrays use data types the Bottleneck functions support.

Choose JAX when you want to compile NumPy programs for TPUs, GPUs and other hardware accelerators. [^5] 

Choose Pythran when scientific code can be compiled ahead of time from the supported subset of Python. [^6]

Choose PyOverdrive when existing NumPy code should keep running on stock NumPy wherever a fast path does not apply. [^7] Use the selfcheck, calibrate, and explain commands: selfcheck compares fast paths with stock NumPy, calibrate re-times the threaded paths on your CPU, and explain shows which path a call would take. [^7] [^7] [^7]

## Frequently asked questions

### Which Numba alternative needs the least code changes?

PyOverdrive patches supported NumPy functions so existing code uses faster paths, and calls it does not support run on stock NumPy. [^7] A fast path runs only when a check confirms the input is in its measured range; anything else, or a fast path that raises an error, goes to stock NumPy. [^7] Before choosing, check whether the project's operations and dtypes are covered by the fast paths.

### How to check what a Numba alternative would speed up?

For PyOverdrive, python -m pyoverdrive --selfcheck compares every fast path with stock NumPy on the machine in use, and --demo times the headline operations with stock NumPy and with PyOverdrive on that machine in about 20 seconds. [^7] [^7] pyoverdrive.explain() tells which path a call would take and why, without running the call. [^7]

### Which Numba alternative works with the Python version in use?

Numba supports Python 3.9-3.12. [^1] Cython 3.0.x supports Python 2.7 and 3.5 and later. [^3] Pythran supports Python 3.7 and upward. [^6] Check each option's supported Python range against the runtime the project already uses.

### Which Numba alternative handles many cores or threads?

PyOverdrive's threaded paths for np.sin, cos, tan, exp, log, log10 and tanh on C-contiguous float64/float32 arrays run above a size floor calibrated per operation and dtype. [^7]

### Can NumPy code stay unchanged when trying an alternative?

PyOverdrive patches supported NumPy functions so existing code uses faster paths, and anything a fast path does not support runs on stock NumPy. [^7] [^7] A single fast path can be turned off with disable_path(), or pyoverdrive.disable() restores the original NumPy functions. [^7]

It is open source under the MIT License. [^7] - [Visit PyOverdrive](/go/numba-alternatives)

## Sources

[^1]: Numba, numba.pydata.org, read 2026-10-07 (https://numba.pydata.org)
[^2]: numexpr, github.com/pydata/numexpr, read 2026-10-07 (https://github.com/pydata/numexpr)
[^3]: Cython, cython.org, read 2026-10-07 (https://cython.org)
[^4]: Bottleneck, github.com/pydata/bottleneck, read 2026-10-07 (https://github.com/pydata/bottleneck)
[^5]: JAX, github.com/jax-ml/jax, read 2026-10-07 (https://github.com/jax-ml/jax)
[^6]: Pythran, github.com/serge-sans-paille/pythran, read 2026-10-07 (https://github.com/serge-sans-paille/pythran)
[^7]: PyOverdrive's own description of itself (the product of this site's publisher) (/go/numba-alternatives)
