Ruff vs Pylint: Python Linting Speed vs Depth
Ruff is an extremely fast Rust linter that replaces many tools; Pylint is slower but performs deeper, more opinionated analysis.
Ruff lints (and can format) Python in a fraction of the time of legacy tools by reimplementing many Flake8/pycodestyle/pyflakes rules in Rust. Pylint runs deeper semantic checks and design heuristics that Ruff does not all cover.
| Ruff | Pylint | |
|---|---|---|
| Language | Rust | Python |
| Speed | Very fast (orders of magnitude) | Slow on large code |
| Rule breadth | Many Flake8/plugins reimplemented | Deep semantic + design checks |
| Config | pyproject.toml [tool.ruff] | .pylintrc / pyproject |
| Autofix | Yes for many rules | No autofix |
Where Ruff wins
Ruff is fast enough to run on every save and every commit without friction, and it consolidates Flake8, isort, pyupgrade, and more behind one tool and config. It autofixes many issues. For most teams it covers the lint rules they actually enforce.
Where Pylint wins
Pylint performs deeper analysis: it catches certain logic issues, flags design smells (too many arguments, complexity), and applies opinionated checks Ruff does not all implement. If you rely on Pylint design or refactoring warnings, Ruff is not yet a full replacement.
In CI
Many teams run Ruff as the fast gate on every PR and run Pylint less often (nightly or on demand) for its deeper signal. Ruff dramatically cuts lint time in pipelines; Pylint adds depth where you want it.
The verdict
Use Ruff as your primary fast linter and formatter for everyday CI; add Pylint when you want its deeper semantic and design checks. They are complementary more than mutually exclusive.