Код: Выделить всё
import polars as pl
x = pl.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
y = x # Here, y is semantically a copy of x and
# users shall treat y as a copy of x, but under the
# hood, y is currently still just a "reference" to x.
y = y.with_columns(
pl.Series([7, 8, 9]).alias('b')
) # Copy-on-write occurs, but only a new column 'b' are created.
z = y # Users shall treat z as a copy of y, but
# under the hood, z is currently still just a
# "reference" to y.
# Create row index for conditional operations
z = z.with_row_index("row_idx")
z = z.with_columns(
pl.when(pl.col("row_idx") == 0)
.then(10)
.otherwise(pl.col("b"))
.alias("b")
) # Copy-on-write kicks in. The entire
# column 'b' is copied and then the first element is
# changed to 10.
z = z.with_columns(
pl.when(pl.col("row_idx") == 1)
.then(11)
.otherwise(pl.col("b"))
.alias("b")
) # The 2nd element is changed in-place to 11.
# Remove the temporary row index column
z = z.drop("row_idx")
Код: Выделить всё
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10, 11, 9]
Изменить: я добавил свое сообщение в ChatGPT, и там написано:
"Второй элемент изменен на 11".
Я прав или прав ИИ? Есть ли какая-либо часть официального документа, которая может дать на этот вопрос авторитетный ответ?
Правка II: Эксперименты показывают, что ИИ прав. Рассматривайте столбец в фрейме данных Polars как «атомарный» объект. Любая модификация приведет к созданию копии. Даже если столбец принадлежит только одному фрейму данных, модификация приведет к созданию нового столбца, который затем «заменяется» обратно в фрейм данных. В принципе старую колонку надо освободить, но я не видел, чтобы системный монитор вернул память, по крайней мере не сразу. Polars (или это может быть просто особенность Python) могут вернуть блок в собственный пул памяти, чтобы избежать вызова ОС для его следующего выделения..
Подробнее здесь: https://stackoverflow.com/questions/797 ... -principle