Полярное выражение When().then().иначе работает медленноPython

Программы на Python
Anonymous
Полярное выражение When().then().иначе работает медленно

Сообщение Anonymous »

Я заметил одну вещь в полярах Python. Я не уверен, но кажется, что pl.when().then().otherwise() где-то работает медленно.
Например, для фрейма данных:

Код: Выделить всё

df = pl.DataFrame({
'A': [randint(1, 10**15) for _ in range(30_000_000)],
'B': [randint(1, 10**15) for _ in range(30_000_000)],
}, schema={
'A': pl.UInt64,
'B': pl.UInt64,
})
Минимум по горизонтали с pl.min_horizontal:

Код: Выделить всё

df.with_columns(
pl.min_horizontal(['A', 'B']).alias('min_column')
)
92.4 ms ± 16.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
И то же самое с if().then().otherwise():

Код: Выделить всё

df.with_columns(
pl.when(
pl.col('A') < pl.col('B')
).then(pl.col('A')).otherwise(pl.col('B')).alias('min_column'),
)
458 ms ± 75.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Я явно измеряю часть When и кажется, что это не является узким местом.

Код: Выделить всё

df.with_columns((pl.col('A') < pl.col('B')).alias('column_comparison'))
49.2 ms ± 6.23 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Если удалить else(), работа будет еще медленнее.

Код: Выделить всё

df.with_columns(
pl.when(
pl.col('A') < pl.col('B')
).then(pl.col('A')).alias('min_column')
)
664 ms ± 19.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Я также пробовал некоторые другие методы горизонтального сокращения, такие как pl.reduce или pl.fold, и кажется, что все они работают намного быстрее, чем When().then().
Итак, вопросы здесь:
  • Это ожидаемое поведение?
  • Почему pl.when().then() много медленнее, чем другие выражения?
  • В каких случаях следует избегать When().then().otherwise()?


Подробнее здесь: https://stackoverflow.com/questions/768 ... se-is-slow

Вернуться в «Python»