mrkeyoor.com_
Fri 16 Oct 18:54 UTC
Dataevaluationupdated 04 Oct 2026

polars review

Polars is a Rust query engine for dataframes, with interfaces for Python, Rust, Node.js, R, and SQL. It helps developers process columnar data through expressions that the engine can optimize, run across CPU cores, and stream when a query supports it.

+4stars / 7d
Verdict

Our Polars run installed 445 packages in 85 seconds, then the build and tests both stopped because the linker could not find -lpython3.11, so source contributors need a prepared Python development environment. For application developers using the packaged Python build, Polars is the first option we would test for a new analytical pipeline on one machine. Choose it for its expression model and lazy optimizer, then protect every schema and interchange boundary with your own tests.

We ran it

Lab card: what happened when we ran polarsScreenshot of polars (docs.pola.rs)
Install✓ · 85s445 packages
Build✗ · 676s
Tests✗ · 133sran, no count parsed
Repo3473 files~859,612 lines of source · 30.7 MB · 19 CI workflows

Answers from our run

Does polars build from source?

Dependencies installed in 85 seconds (445 packages), and the build failed. We cloned commit 7c15afa into a clean Debian container with 3 CPUs and no project-specific setup.

Do polars's tests pass?

The test command failed in our container, and its output did not report a pass or fail count.

Who should not use polars?

Teams that require drop-in pandas compatibility: Polars has its own expression and index-free model, so migration means rewriting code.

What are the alternatives to polars?

pandas, DuckDB, Apache DataFusion. Our Polars run installed 445 packages in 85 seconds, then the build and tests both stopped because the linker could not find -lpython3.

Setup3/5One-command wheel install, but our source build failed at linking
Docs5/5Clear guides for APIs, streaming, plugins, and special installs
Community5/5Pushed October 4 with active fixes and 39,914 stars
Maturity4/5Broad engine and CI footprint, though our source build did not pass

Discussed on

  1. hnPolars 2.0471 points
  2. hnPre-Release of Polars 2.0403 points
  3. hn650GB of Data (Delta Lake on S3). Polars vs. DuckDB vs. Daft vs. Spark263 points
  4. hnPolars Cloud: The Distributed Cloud Architecture to Run Polars Anywhere261 points
  5. hnWhy Polars rewrote its Arrow string data type226 points

Who it’s for

Data teams starting new Python pipelines around Parquet, CSV, Arrow, Delta, or Iceberg files.
Engineers willing to learn expressions and lazy queries instead of carrying over pandas habits.
Rust developers who want a native dataframe engine with bindings for other languages.
Teams that can test schemas, nulls, dates, and interchange boundaries against real data.

Who it’s NOT for

Teams that require drop-in pandas compatibility: Polars has its own expression and index-free model, so migration means rewriting code.
Operators who need an open-source distributed scheduler in the core project: the README sends horizontal scaling users to Polars Cloud.
Contributors expecting a stock Debian source build after dependency installation: our build and test commands both stopped because the linker could not find -lpython3.11.
Users who cannot choose a special install for old CPUs, more than roughly 4.2 billion rows, or x86-64 Python under Rosetta: the installation guidance calls out each case.
GPU teams without NVIDIA hardware: the README describes GPU acceleration as optional and NVIDIA-specific.

Setup reality

Our sandbox installed 445 packages in 85 seconds at commit 7c15afa. The build failed after 676 seconds with exit 101, and tests failed after 133 seconds with exit 101. Both log tails say rust-lld could not find -lpython3.11; they do not show failed assertions.

The ordinary Python path is pip install polars, with no account, credential, or server required. Building the Python package from source requires a current Rust compiler and maturin, followed by one of the documented make targets inside py-polars.

The 30.7 MB checkout held 3,473 files and about 859,612 source lines. Older CPUs may need LTS_CPU=1, very large row indexes need a different package choice, and x86-64 Python under Rosetta has its own installation path.

Lazy execution gives Polars the whole query before it runs

Polars 1.44.2 was the latest Python release we found, and its lazy API asks you to describe column operations as expressions. Those expressions become a query plan before any data is collected. That gives the engine room to move filters toward the source, avoid reading unused columns, and run independent work across CPU cores. The README's example scans Parquet, filters orders, groups by customer, aggregates values, sorts them, and only then calls collect(). The style is compact once it clicks, though it demands a different mental model from stepwise pandas mutation.

The engine also has eager execution, SQL, and bindings for Python, Rust, Node.js, and R. Apache Arrow is the interchange format. Streaming can process queries, or parts of them, without keeping the entire dataset in memory. That last qualification matters: you should run your actual query and watch memory rather than treating larger-than-RAM support as a blanket promise. The 3 CPU and 12 GB sandbox we used measured build mechanics, not query speed or memory use.

The 30.7 MB checkout is a multi-language engine

We cloned commit 7c15afa, which contained 3,473 files and about 859,612 lines of source in a 30.7 MB checkout. That size reflects the real scope: a Rust engine, Python bindings, file readers, SQL support, streaming code, plugins, and interfaces for several languages live around the same project. Our scan also found 19 CI workflow files. There was no Dockerfile and no top-level tests directory, which describes the repository layout rather than the quality of its test coverage.

The 859,612-line codebase presents application developers with one main choice: eager convenience or lazy planning. A short interactive cleanup can stay eager. A maintained pipeline gains more from a lazy scan because the optimizer can see the whole chain before execution. Polars also supports custom I/O and expression plugins for work the built-in API does not cover. Each extension moves more responsibility onto you, especially when native code, remote storage, or conversions to pandas and Arrow sit at the boundary.

What happened when we ran it

Our measurement setup used a fresh Debian sandbox, which installed 445 packages in 85 seconds. It used the lab-rust:1 image with 3 CPUs, 12 GB of RAM, no secrets, and no elevated privileges. The install completed successfully. The build then ran for 676 seconds and exited with code 101 while compiling polars-dylib. The last linker message was precise: rust-lld could not find the library -lpython3.11.

The test command failed after 133 seconds with the same exit code. This time the final compile error appeared under polars-parquet's library tests, and the linker again said it could not find -lpython3.11. The supplied log has no completed test count and no failed assertion. We can say the suite did not run to completion in our environment. We cannot say Polars' tests found a behavioral defect, or explain why that Python library was absent.

The wheel takes one command, while source builds need Rust and maturin

For Python Polars 1.44.2, the README gives users a one-line start: pip install polars. Local dataframe work does not require an API token, database, or long-running service. Source contributors take a longer route. The documented Python build needs a current Rust compiler and maturin, then offers 6 make targets ranging from a faster debug-oriented compile to an optimized distribution build with extreme compile time. Our 676-second failure shows why the wheel and contributor experiences should be judged separately.

Hardware and data shape can change the package choice. The README says LTS_CPU=1 is available for CPUs that lack instructions such as AVX2. It points users with more than 2^32 rows, about 4.2 billion, to installation guidance for larger indexes. An x86-64 Python build running under Rosetta on Apple Silicon also needs attention. These are documented paths, yet they make fleet-wide installation less automatic than the basic pip command suggests.

October fixes show more than the September release tag

GitHub showed 39,914 stars and 2,930 open issues and pull requests on October 4, 2026. The repository was pushed that day. Recent work included issue 29707, a report that nested caches could drop a projection and return wrong results; it was closed two days after it opened, alongside the related fixes. That pace is stronger health evidence than a release badge by itself, while the combined queue should not be misread as 2,930 confirmed bugs.

The latest release we found was Python Polars 1.44.2, published September 9, 2026 as a backport release. A busy optimizer and a wide set of file formats mean upgrades deserve contract tests around schemas, dates, nulls, joins, and Arrow or pandas conversion. Nineteen CI workflows show substantial automation in the repository. They do not replace checks using your files, especially when a recent issue concerned a query returning an incorrect result.

Our 676-second source build failed, so start with the wheel

Pandas remains the safer pick when library compatibility and existing notebooks decide the job. DuckDB fits teams that think in SQL and want embedded database behavior. DataFusion is closer to a construction kit for teams building their own query engine. Polars occupies a useful middle ground: a dataframe API backed by a query optimizer, with Rust available when Python is no longer the right integration layer.

Start with the packaged build and one representative pipeline. Check the result against the system it would replace, then inspect memory and runtime on your own hardware. Our 85-second install succeeded, but the 676-second build and 133-second test steps both ended at the same missing linker library. That is enough to recommend Polars for users of published packages and to warn source contributors that a fresh Debian container needs more preparation than dependency installation alone.

Alternatives

ProjectWhat it isPick it when
pandas gh↗Python's established labeled-dataframe library with broad package compatibility.pick this instead when existing notebooks and Python libraries already depend on pandas behavior.
DuckDB gh↗An embedded analytical database that queries files and dataframes with SQL.pick this instead when SQL and database semantics are the natural interface for the work.
Apache DataFusion gh↗A Rust and Apache Arrow query engine designed for embedding and extension.pick this instead when you are building a query system rather than adopting a dataframe API.

What people are saying

  1. [github-trending] pola-rs/polars

Sources

  1. Polars repository and README
  2. Polars installation guide
  3. Python Polars 1.44.2 release
  4. Nested cache projection issue 29707

More data reviews

wine-quality-svc-tuning · dhis2-immunisation-audit · OpenTerminal · The-Quant-Trading-Vault · multimodal-product-discovery · edgequake · the whole board →