Skip to content

How do Ruff and Pylint compare?

Ruff covers most of Pylint’s common checks and runs orders of magnitude faster. Pylint adds duplicate-code detection and cyclomatic complexity enforcement that Ruff doesn’t yet implement. For most new projects, Ruff is the right default.

Ruff runs orders of magnitude faster

Ruff’s Rust implementation analyzes Python files orders of magnitude faster than Pylint’s Python codebase. The gap is most visible in large codebases and CI pipelines.

Ruff covers more rules; Pylint goes deeper

Pylint implements approximately 409 rules. Ruff covers over 950 total rules, with around 209 overlapping with Pylint’s ruleset.

Note

Astral (now part of OpenAI) also maintains ty, a type checker that covers the deeper analysis Ruff doesn’t yet handle: argument validation and type inference.

Ruff fixes issues automatically; Pylint reports them

Ruff applies automatic fixes for many of the issues it finds: removing unused imports, sorting imports, rewriting deprecated syntax. Pylint reports issues without rewriting code.

Pylint supports plugins; Ruff doesn’t

Pylint’s plugin system lets you write custom checkers. Ruff implements all rules natively and has no plugin support.

Run both tools together

The most common combination runs Ruff for speed and breadth, then layers Pylint only for the semantic checks it uniquely handles. A type checker fills the gap where neither linter does type-aware inference:

  • Ruff for fast, automated style enforcement and common patterns
  • Pylint for deeper static analysis (duplicate-code detection, cyclomatic complexity)
  • ty or mypy for argument and type validation

Learn More

Last updated on