gpt4 book ai didi

python - 为什么在一种情况下 pandas 数据框的一列中的值变化快而在另一种情况下变化慢?

转载 作者:太空狗 更新时间:2023-10-29 22:17:34 26 4
gpt4 key购买 nike

我有两段代码似乎做同样的事情,但其中一段比另一段快将近一千倍。

这是第一部分:

t1 = time.time()
df[new_col] = np.where(df[col] < j, val_1, val_2)
t2 = time.time()
ts.append(t2 - t1)

ts 我有这样的值:

0.0007321834564208984, 0.0002918243408203125, 0.0002799034118652344

相比之下,这部分代码:

t1 = time.time()
df['new_col'] = np.where((df[col] >= i1) & (df[col] < i2), val, df.new_col)
t2 = time.time()
ts.append(t2 - t1)

创建 ts 并填充如下值:

0.11008906364440918, 0.09556794166564941, 0.08580684661865234

我无法弄清楚第一个和第二个作业之间的本质区别是什么。

在这两种情况下,df 应该相同。

已添加

原来本质的区别不在我看的地方。在我拥有的代码的快速版本中:

df = inp_df.copy()

在类方法的开头(其中 inp_df 是该方法的输入数据框)。在慢速版本中,我直接在输入数据帧上进行操作。复制输入数据帧并对其进行操作后,速度变快了。

最佳答案

分配不是瓶颈

为 Pandas 系列赋值很便宜,尤其是当您通过 pd.Seriesnp.ndarraylist 等常规对象赋值时>.

广播更便宜

备注broadcasting非常便宜,即当您在第一个示例中设置标量值时,例如 val_1val_2

您的第二个示例针对不满足您的条件的情况进行了系列分配。这是相对昂贵的。

计算成本相对较高

另一方面,您执行的计算相对昂贵。

在第一个示例中,您有一个计算:

df[col] < j

在第二个例子中,你至少有三个计算:

a = df[col] >= i1
b = df[col] < i2
a & b

因此,您可以而且应该预期第二个版本会更贵。

使用timeit

最好使用 timeit 模块来实现可靠的性能计时。下面的可重现示例显示了比您声称的更小的性能差异:

import pandas as pd, numpy as np

np.random.seed(0)
df = pd.DataFrame({'A': np.random.random(10**7)})

j = 0.5
i1, i2 = 0.25, 0.75

%timeit np.where(df['A'] < j, 1, 2) # 85.5 ms per loop
%timeit np.where((df['A'] >= i1) & (df['A'] < i2), 1, df['A']) # 161 ms per loop

一次计算比 3 次计算便宜:

%timeit df['A'] < j                                             # 14.8 ms per loop
%timeit (df['A'] >= i1) & (df['A'] < i2) # 65.6 ms per loop

通过标量值进行广播比分配系列更便宜:

%timeit np.where(df['A'] < j, 1, df['A'])                       # 113 ms per loop
%timeit np.where((df['A'] >= i1) & (df['A'] < i2), 1, 2) # 146 ms per loop

关于python - 为什么在一种情况下 pandas 数据框的一列中的值变化快而在另一种情况下变化慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53632928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com