Skip to content

Commit 825e027

Browse files
authored
perf: Avoid evaluating expr twice in mean_horizontal (#2028)
1 parent a90a6a9 commit 825e027

File tree

3 files changed

+9
-16
lines changed

3 files changed

+9
-16
lines changed

narwhals/_arrow/namespace.py

+3-8
Original file line numberDiff line numberDiff line change
@@ -237,14 +237,9 @@ def mean_horizontal(self: Self, *exprs: ArrowExpr) -> IntoArrowExpr:
237237
dtypes = import_dtypes_module(self._version)
238238

239239
def func(df: ArrowDataFrame) -> list[ArrowSeries]:
240-
series = (
241-
s.fill_null(0, strategy=None, limit=None)
242-
for _expr in exprs
243-
for s in _expr(df)
244-
)
245-
non_na = (
246-
1 - s.is_null().cast(dtypes.Int64()) for _expr in exprs for s in _expr(df)
247-
)
240+
expr_results = [s for _expr in exprs for s in _expr(df)]
241+
series = (s.fill_null(0, strategy=None, limit=None) for s in expr_results)
242+
non_na = (1 - s.is_null().cast(dtypes.Int64()) for s in expr_results)
248243
return [reduce(operator.add, series) / reduce(operator.add, non_na)]
249244

250245
return self._create_expr_from_callable(

narwhals/_dask/namespace.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,9 @@ def concat(
237237

238238
def mean_horizontal(self: Self, *exprs: DaskExpr) -> DaskExpr:
239239
def func(df: DaskLazyFrame) -> list[dx.Series]:
240-
series = (s.fillna(0) for _expr in exprs for s in _expr(df))
241-
non_na = (1 - s.isna() for _expr in exprs for s in _expr(df))
240+
expr_results = [s for _expr in exprs for s in _expr(df)]
241+
series = (s.fillna(0) for s in expr_results)
242+
non_na = (1 - s.isna() for s in expr_results)
242243
return [
243244
name_preserving_div(
244245
reduce(name_preserving_sum, series),

narwhals/_pandas_like/namespace.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -240,12 +240,9 @@ def func(df: PandasLikeDataFrame) -> list[PandasLikeSeries]:
240240

241241
def mean_horizontal(self: Self, *exprs: PandasLikeExpr) -> PandasLikeExpr:
242242
def func(df: PandasLikeDataFrame) -> list[PandasLikeSeries]:
243-
series = (
244-
s.fill_null(0, strategy=None, limit=None)
245-
for _expr in exprs
246-
for s in _expr(df)
247-
)
248-
non_na = (1 - s.is_null() for _expr in exprs for s in _expr(df))
243+
expr_results = [s for _expr in exprs for s in _expr(df)]
244+
series = (s.fill_null(0, strategy=None, limit=None) for s in expr_results)
245+
non_na = (1 - s.is_null() for s in expr_results)
249246
return [reduce(operator.add, series) / reduce(operator.add, non_na)]
250247

251248
return self._create_expr_from_callable(

0 commit comments

Comments
 (0)