Удивительно, но Polars >= 0.17.13 работает лучше, если ему разрешено использовать только один поток. Для некоторых более ранних версий Polars разницы нет.
# polars>=0.17.3
import polars as pl
import time
import os
def compute(initial_value: pl.Expr) -> pl.Expr:
"""Waste some CPU power to compute the golden ratio"""
result = initial_value
for i in range(100):
result = (1 + result) ** 0.5
return result
# Block parallel execution of polars expressions
os.environ["POLARS_MAX_THREADS"] = "1" # the more - the slower
# Create a dataframe
df = pl.DataFrame(pl.repeat(0.0, 10_000_000, eager=True).alias("value"))
# Compute
start_time = time.perf_counter()
df_b = (
df.lazy().with_columns(compute(pl.col("value")).alias("result")).collect()
)
delta_time = time.perf_counter() - start_time
print(f"Thread pool size: {pl.threadpool_size()}. Time: {delta_time:.3f} s.")
Ниже приведены результаты с os.environ["POLARS_MAX_THREADS"] = "1" и без него.
Thread pool size: 1. Time: 2.102 s.
Thread pool size: 16. Time: 3.634 s.
Подробнее здесь: https://stackoverflow.com/questions/765 ... faster-tha