【发布时间】:2015-07-27 20:10:32
【问题描述】:
问题
有谁知道为什么直接在熊猫系列上设置项目如此慢?是我做错了什么,还是事情就是这样?
我进行了几次测试,看看最快的方法是在 pandas Series 对象上设置值。以下是结果,按从快到慢的顺序排列:
初始化数组,使用整数索引设置,创建系列
%%timeit
a = np.empty(1000, dtype='float')
for i in range(len(a)):
a[i] = 1.0
s = pd.Series(data=a)
1000 次循环,最好的 3 次:每个循环 630 µs
创建空列表,使用追加添加项目,创建系列
%%timeit
l = []
for i in range(1000):
l.append(1.0)
s = pd.Series(data=l)
1000 次循环,3 次中的最佳:每个循环 1.05 毫秒
初始化数组,创建系列,使用 set_value 设置
%%timeit
a = np.empty(1000, dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
s.set_value(i, 1.0)
100 次循环,3 次中的最佳:每个循环 18.5 毫秒
初始化数组,创建系列,使用整数索引设置
%%timeit
a = np.empty(1000, dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
s[i] = 1.0
10 个循环,3 个循环中的最佳值:每个循环 30.2 毫秒
初始化数组,创建系列,使用iat设置
%%timeit
a = np.empty(1000, dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
s.iat[i] = 1.0
10 个循环,3 个循环中的最佳值:每个循环 36.2 毫秒
初始化数组,创建系列,使用 iloc 设置
%%timeit
a = np.empty(1000, dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
s.iloc[i] = 1.0
1 次循环,3 次取胜:每个循环 280 毫秒
【问题讨论】:
-
您的时间也是系列创作的时间。尝试预先创建系列并仅计时设置操作。
-
试试
s.iat[i] = 1.0,我相信这里的索引方法会执行一些检查:pandas.pydata.org/pandas-docs/stable/…iloc得到 159 毫秒,iat版本得到 23.3 毫秒 -
@BrenBarn:我尝试只为数组和系列的创建计时,但这只需要 172 微秒
-
@EdChum:编辑了我的答案以包括使用 s.iat[i] 进行设置。它的表现略逊于 s[i]...
-
是的,我观察到同样的事情,不知道为什么,但它比
iloc快得多