Skip to main content

Fast-Filter

PyPI version Python versions License

Your declarative filters in Python are 10x slower than they should be. Fast-Filter compiles them into optimized, native Python bytecode on the fly, making them 10x-15x faster with zero external dependencies.


Why Fast-Filter?

Many modern Python frameworks and libraries rely heavily on declarative query filters (e.g., magic-filter). While beautiful and readable, magic-filter acts as an AST interpreter, walking through object structures and evaluating attributes on every single incoming event.

For high-load bots and applications processing thousands of messages per second, this constant interpretation becomes a major CPU bottleneck.

Fast-Filter solves this. It keeps the exact same, intuitive F syntax but acts as a Lazy JIT Compiler. The first time a filter is resolved, it dynamically compiles the filter's syntax tree into a native, single-line Python lambda function, which is then reused for subsequent events.


Quickstart

Get up and running in less than 30 seconds.

1. Install

[!NOTE] PyPI Name Note: The package is currently published on PyPI as fast-magic-filter while PyPI support ticket #11230 is under review. The Python import name is always fast_filter.

pip install fast-magic-filter

2. Copy & Run

from fast_filter import F

# 1. Define your filter (exact same F-syntax)
my_filter = (F.from_user.role == "admin") & (F.text.startswith("/alert"))

# 2. Resolve immediately against any object/dict
class Message:
    def __init__(self, text, role):
        self.text = text
        self.from_user = type("User", (), {"role": role})()

msg = Message("/alert high CPU usage", "admin")

# The first call JIT-compiles the lambda; subsequent calls run at native speed
assert my_filter.resolve(msg) is True

Measured Performance

Benchmarks run with 100,000 iterations comparing fast-filter against magic-filter:

  • Simple Attribute Access (F.from_user.id == 1): ~6.1x faster.
  • Logic & Methods (role == 'admin' & text.startswith): ~6.0x faster.
  • Mapping & Aggregators (tags[...].len().any()): ~20.6x faster.

[!TIP] Try running the benchmarks locally to see the speedup on your machine:

python benchmarks/final_report.py

Sane Defaults & Fixes

Fast-Filter is not just faster; it fixes several behavioral quirks of magic-filter:

  1. RegExp Everywhere: Magic-filter uses re.match (matching only the beginning of a string). Fast-filter uses re.search (matching anywhere), which is the behavior most developers expect.
  2. Multi-Level Mapping: Supports arbitrary depth nested sequence mapping (e.g. F.matrix[...][...].val > 0).
  3. Sane None Logic: Comparing a missing attribute in magic-filter (e.g., F.missing == None) resolves to None. In Fast-Filter, this evaluates to True, consistent with standard Python logic.
  4. Exception-Free Compilation: Fast-Filter compiles code with built-in safety guards, ensuring that missing attributes or type conflicts do not raise uncaught exceptions but safely return None or False.

What to Read Next?

  • GUIDE: Explore advanced features like value capturing with .as_() & .extract(), slicing, and bitwise operations.
  • COMPARISON: Detailed feature-by-feature matrix comparing Fast-Filter and Magic-Filter.

Contribution

If you find this library useful, please give it a star on GitHub! Feel free to open issues and pull requests to help improve the project.


License

This project is licensed under the Mozilla Public License 2.0 (MPL 2.0). See the LICENSE file for details.

Copyright (c) 2025-2026 Dmitrii Gagarin aka madgagarin.

Metadata

Release files for fast-magic-filter 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fast-magic-filter 1.1.0
File Size Uploaded
fast_magic_filter-1.1.0.tar.gz 24.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fast-magic-filter 1.1.0
File Interpreter ABI Platform
fast_magic_filter-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 38.6 kB

Release files / fast_magic_filter-1.1.0.tar.gz

Download URL fast_magic_filter-1.1.0.tar.gz
Size 24.4 kB
Tags Source
SHA-256 checksum
How to use checksums
83cb1bf34b0c53c25f890446c23a7729555902361eff242d7415d8f7d497424d
BLAKE2b-256 checksum
How to use checksums
f1a647996b0cb1806f4926c8fceba2a2e179a1f68c7638784964010682cea116
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.6

Release files / fast_magic_filter-1.1.0-py3-none-any.whl

Download URL fast_magic_filter-1.1.0-py3-none-any.whl
Size 14.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d96ef79b84c2459a39f835ae0dc2d5653fbf02a020732ec9e757e89afae81a3a
BLAKE2b-256 checksum
How to use checksums
df5899a2d4d364e2bcccc6ac10d877e19d3569705e49ecbb5ef7ba02f6c5603c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.6

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page