NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #242 most downloaded on PyPI
rapid fuzzy string matching
Last release 1 months ago
30 Aug 2026
Release timing varies
gaps range from 2 weeks to 5 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
7 years old
175 releases · first in 2020
One column per quarter.
fix some divergences in the pure Python fallback
fix release ci attempting to upload a pyodide wheel
fix type hints for extractOne when no score_cutoff is provided
Cython==3.2.4.add missing pypy and freethreaded linux wheels
Changed upgrade to Cython==3.1.6 enable free threading
Cython==3.1.6Fully disable line tracing in release builds
upgrade to Cython==3.1.3 . This enables compilation with free threaded python.
Cython==3.1.3. This enables compilation with free threaded python.rapidfuzz-cpp==3.3add support for arrays of type 'w'
cdist and cpdistrapidfuzz-cpp==3.3.2Added added wheels for pypy 3.11
added wheels for pypy 3.11
upgrade to Cython==3.0.12
Fixed fix version number
improve calculation of min score inside partial_ratio so it can skip more alignments
fix incorrect results in simd optimized implementation of Levenshtein and OSA on 32bit targets
switch build system to scikit-build-core
scikit-build-corefix crash in cdist due to Visual Studio upgrade
cdist due to Visual Studio upgrade## Changed * upgrade to Cython==3.0.11 * add python 3.13 wheels
Cython==3.0.11include simd binaries in pyinstaller builds
scikit-buildfix bug in Levenshtein.editops and Levenshtein.opcodes which could lead to incorrect results and crashes for some inputs
Levenshtein.editops and Levenshtein.opcodes which could lead
to incorrect results and crashes for some inputsfix None handling for queries in process.cdist for scorers not supporting SIMD
process.cdist for scorers not supporting SIMDfix supported versions of taskflow in cmake to be in the range v3.3 - v3.7
disable AVX2 on MacOS since it did lead to illegal instruction errors on some targets
disable AVX2 on MacOS since it did lead to illegal instructions being generated
significantly improve type hints for the library
use the correct version of rapidfuzz-cpp when building against a system installed version
rapidfuzz-cpp when building against a system installed versionadded process.cpdist which allows pairwise comparison of two collection of inputs
process.cpdist which allows pairwise comparison of two collection of inputs## Changed * reduce import time
upgrade rapidfuzz-cpp which includes a fix for build issues on some compilers
Cython==3.0.9rapidfuzz-cpp which includes a fix for build issues on some compilersfix overflow error on systems with sizeof(size_t) < 8
sizeof(size_t) < 8fix pure python fallback implementation of fuzz.token_set_ratio
fuzz.token_set_ratio-latomic if std::atomic<uint64_t> is not natively supportedO((|s1|/64) * |s2|) to O((score_cutoff/64) * |s2|)Cython==3.0.7uint32 instead of int32 by defaultuse _mm_malloc/_mm_free on macOS if aligned_alloc is unsupported
fix compilation failure on macOS
add simd implementation for Jaro and Jaro Winkler
Cython==3.0.3add missing tag for python 3.12 support
implement the remaining missing features from the C++ implementation in the pure Python implementation
Cython==3.0.2build x86 with sse2/avx2 runtime detection
## Changed - upgrade to Cython==3.0.0
Cython==3.0.0replace usage of isnan with std::isnan which fixes the build on NetBSD
taskflow==3.6isnan with std::isnan which fixes the build on NetBSDadded keyword argument pad to Hamming distance. This controls whether sequences of different length should be padded or lead to a ValueError
pad to Hamming distance. This controls whether sequences of different
length should be padded or lead to a ValueErrorCython==3.0.0b3process.cdistprocess moduleallow the usage of Hamming for different string lengths. Length differences are handled as insertions / deletions
allow the usage of Hamming for different string lengths. Length differences are handled as
insertions / deletions
remove support for boolean preprocessor functions in rapidfuzz.fuzz and rapidfuzz.process.
The processor argument is now always a callable or None.
update defaults of the processor argument to be None everywhere. For affected functions this can change results, since strings are no longer preprocessed. To get back the old behaviour pass processor=utils.default_process to these functions. The following functions are affected by this:
process.extract, process.extract_iter, process.extractOnefuzz.token_sort_ratio, fuzz.token_set_ratio, fuzz.token_ratio, fuzz.partial_token_sort_ratio, fuzz.partial_token_set_ratio, fuzz.partial_token_ratio, fuzz.WRatio, fuzz.QRatiorapidfuzz.process no longer calls scorers with processor=None. For this reason user provided scorers no longer require this argument.
remove option to pass keyword arguments to scorer via **kwargs in rapidfuzz.process. They can be passed
via a scorer_kwargs argument now. This ensures this does not break when extending function parameters and
prevents naming clashes.
remove rapidfuzz.string_metric module. Replacements for all functions are available in rapidfuzz.distance
rapidfuzz.distanceNone and float("nan") in process.cdist as long as the underlying scorer supports it.
This is the case for all scorers returning normalized results.Since rapidfuzz v2.x is still widely used, Python 3.12 support is backported to rapidfuzz v2.x.
Since rapidfuzz v2.x is still widely used, Python 3.12 support is backported to rapidfuzz v2.x.
fix incorrect tag dispatching implementation leading to AVX2 instructions in the SSE2 code path
allow the usage of finite generators as choices in process.extract
process.extractupgrade required Cython version to Cython==3.0.0b2
Cython==3.0.0b2process.cdistprocess.cdist with pure python scorersfix function signature of get_requires_for_build_wheel
get_requires_for_build_wheelreformat changelog as restructured text to get rig of m2r2 dependency
m2r2 dependencyfix two cases of undefined behavior in process.cdist
process.cdisthandle float("nan") similar to None for query / choice, since this is common for non-existent data in tools like numpy
float("nan") similar to None for query / choice, since this is common for
non-existent data in tools like numpyNone/float("nan") in process.distanceimprove handling of functions wrapped using functools.wraps
functools.wrapsImportError occurs on import.
This can e.g. occur when the binary has a dependency on libatomic, but it is unavailable on
the systemCMAKE_C_COMPILER_AR/CMAKE_CXX_COMPILER_AR/CMAKE_C_COMPILER_RANLIB/CMAKE_CXX_COMPILER_RANLIB
if they are not defined yetfix incorrect results in Hamming.normalized_similarity
Hamming.normalized_similarityPostfix.normalized_distance and Prefix.normalized_distanceLevenshtein.normalized_similarity and Levenshtein.normalized_distance
when used in combination with the process modulefuzz.partial_ratio was not always symmetric when len(s1) == len(s2)fix bug in normalized_similarity of most scorers, leading to incorrect results when used in combination with the process module
normalized_similarity of most scorers,
leading to incorrect results when used in combination with the process moduleJaroWinkler and Jaro when used in the pure python process moduleprocess.extractfix bug in Levenshtein.editops leading to crashes when used with score_hint
Levenshtein.editops leading to crashes when used with score_hintrapidfuzz_capi into rapidfuzz, since it will always
succeed the installation now that there is a pure Python modescore_hint argument to process modulescore_hint argument to Levenshtein modulefixed packaging with pyinstaller
Prefix/Suffix similarityFix segmentation fault in process.cdist when used with an empty query sequence
process.cdist when used with an empty query sequencemove jarowinkler dependency into rapidfuzz to simplify maintenance
fuzz.ratio/fuzz.QRatio/Levenshtein/Indel/LCSseq/OSA to improve
performance for short strings in cdistuse scikit-build=0.14.1 on Linux, since scikit-build=0.15.0 fails to find the Python Interpreter
scikit-build=0.14.1 on Linux, since scikit-build=0.15.0 fails to find the Python Interpreteruse scikit-build=0.14.1 on Linux, since scikit-build=0.15.0 fails to find the Python Interpreter
workaround gcc in bug in template type deduction
fix support for cmake versions below 3.17
modernize cmake build to fix most conda-forge builds
add editops to hamming distance
add editops to hamming distance
strip common affix in osa distance
ignore missing pandas in Python 3.11 tests
add optimal string alignment (OSA)
fuzz.partial_ratio did not find the optimal alignment in some edge cases
fuzz.partial_ratio did not find the optimal alignment in some edge cases (#219)fuzz.partial_ratioall functions in the string_metric module do now raise a deprecation warning. They are now only wrappers for their replacement functions, which makes…
Levenshtein.distance/Levenshtein.editops for
long sequences.score_hint parameter to Levenshtein.editops which allows the use of a
faster implementationstring_metric module do now raise a deprecation warning.
They are now only wrappers for their replacement functions, which makes them slower
when used with the process modulefix incorrect results of partial_ratio for long needles
Your coding agent can read these notes before it upgrades. Set up the MCP server →