mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-28 04:45:01 +00:00
![]() ## Summary This PR implements a variety of optimizations to improve performance of the Eradicate rule, which always shows up in all-rules benchmarks and bothers me. (These improvements are not hugely important, but it was kind of a fun Friday thing to spent a bit of time on.) The improvements include: - Doing cheaper work first (checking for some explicit substrings upfront). - Using `aho-corasick` to speed an exact substring search. - Merging multiple regular expressions using a `RegexSet`. - Removing some unnecessary `\s*` and other pieces from the regular expressions (since we already trim strings before matching on them). ## Test Plan I benchmarked this function in a standalone crate using a variety of cases. Criterion reports that this version is up to 80% faster, and almost every case is at least 50% faster: ``` Eradicate/Detection/# Warn if we are installing over top of an existing installation. This can time: [101.84 ns 102.32 ns 102.82 ns] change: [-77.166% -77.062% -76.943%] (p = 0.00 < 0.05) Performance has improved. Found 3 outliers among 100 measurements (3.00%) 3 (3.00%) high mild Eradicate/Detection/#from foo import eradicate time: [74.872 ns 75.096 ns 75.314 ns] change: [-84.180% -84.131% -84.079%] (p = 0.00 < 0.05) Performance has improved. Found 1 outliers among 100 measurements (1.00%) 1 (1.00%) high mild Eradicate/Detection/# encoding: utf8 time: [46.522 ns 46.862 ns 47.237 ns] change: [-29.408% -28.918% -28.471%] (p = 0.00 < 0.05) Performance has improved. Found 7 outliers among 100 measurements (7.00%) 6 (6.00%) high mild 1 (1.00%) high severe Eradicate/Detection/# Issue #999 time: [16.942 ns 16.994 ns 17.058 ns] change: [-57.243% -57.064% -56.815%] (p = 0.00 < 0.05) Performance has improved. Found 3 outliers among 100 measurements (3.00%) 2 (2.00%) high mild 1 (1.00%) high severe Eradicate/Detection/# type: ignore time: [43.074 ns 43.163 ns 43.262 ns] change: [-17.614% -17.390% -17.152%] (p = 0.00 < 0.05) Performance has improved. Found 5 outliers among 100 measurements (5.00%) 3 (3.00%) high mild 2 (2.00%) high severe Eradicate/Detection/# user_content_type, _ = TimelineEvent.objects.using(db_alias).get_or_create( time: [209.40 ns 209.81 ns 210.23 ns] change: [-32.806% -32.630% -32.470%] (p = 0.00 < 0.05) Performance has improved. Eradicate/Detection/# this is = to that :( time: [72.659 ns 73.068 ns 73.473 ns] change: [-68.884% -68.775% -68.655%] (p = 0.00 < 0.05) Performance has improved. Found 9 outliers among 100 measurements (9.00%) 7 (7.00%) high mild 2 (2.00%) high severe Eradicate/Detection/#except Exception: time: [92.063 ns 92.366 ns 92.691 ns] change: [-64.204% -64.052% -63.909%] (p = 0.00 < 0.05) Performance has improved. Found 4 outliers among 100 measurements (4.00%) 2 (2.00%) high mild 2 (2.00%) high severe Eradicate/Detection/#print(1) time: [68.359 ns 68.537 ns 68.725 ns] change: [-72.424% -72.356% -72.278%] (p = 0.00 < 0.05) Performance has improved. Found 2 outliers among 100 measurements (2.00%) 1 (1.00%) low mild 1 (1.00%) high mild Eradicate/Detection/#'key': 1 + 1, time: [79.604 ns 79.865 ns 80.135 ns] change: [-69.787% -69.667% -69.549%] (p = 0.00 < 0.05) Performance has improved. ``` |
||
---|---|---|
.. | ||
flake8_to_ruff | ||
ruff_benchmark | ||
ruff_cache | ||
ruff_cli | ||
ruff_dev | ||
ruff_diagnostics | ||
ruff_formatter | ||
ruff_index | ||
ruff_linter | ||
ruff_macros | ||
ruff_notebook | ||
ruff_python_ast | ||
ruff_python_codegen | ||
ruff_python_formatter | ||
ruff_python_index | ||
ruff_python_literal | ||
ruff_python_parser | ||
ruff_python_resolver | ||
ruff_python_semantic | ||
ruff_python_stdlib | ||
ruff_python_trivia | ||
ruff_shrinking | ||
ruff_source_file | ||
ruff_text_size | ||
ruff_wasm | ||
ruff_workspace |