运行此代码显示了熊猫和常规python列表之间的速度差异:
url(r'^password-reset/done/',...)
结果(10个索引随机元素的试验10万次):
ser = pd.Series(range(100))
lst = ser.tolist()
for _ in range(10):
pandas_time = 0
list_time = 0
for _ in range(100000):
r = randint(0, len(ser)-1)
t = time()
ser[r]
pandas_time += time() - t
t = time()
lst[r]
list_time += time() - t
print(pandas_time, list_time)
索引熊猫系列似乎比python列表慢30-100倍。为什么?我们如何加快速度?
答案 0 :(得分:2)
我检查了Pandas Regular List
0.6404812335968018 0.03125190734863281
0.6560468673706055 0.0
0.5779874324798584 0.01562190055847168
0.5467743873596191 0.015621662139892578
0.6106545925140381 0.004016399383544922
0.5866603851318359 0.029597759246826172
0.7981059551239014 0.016004562377929688
0.8128316402435303 0.013040542602539062
0.5566465854644775 0.021578073501586914
0.6386256217956543 0.00500178337097168
源代码。与常规python列表相比,pandas系列中的pandas'
实现具有许多其他业务逻辑,因为pandas系列支持使用列表和可迭代对象建立索引。
索引熊猫系列时:
尝试调用可调用的密钥
获取该键处的索引值(听起来很简单,但请记住,索引是另一个熊猫对象,它还必须支持常规索引以外的工作)
检查2)是否为标量
如果是标量,则返回结果
与常规的python列表相比,这些额外的步骤大大降低了__getitem__
的速度。
要解决此问题,您可以直接使用基础的numpy数组。在这里,我们使用__getitem__
来索引:
ser.values
在索引1000000个随机元素10次之后,我们发现使用ser = pd.Series(range(100))
lst = ser.tolist()
ser = ser.values
for _ in range(10):
pandas_time = 0
list_time = 0
for _ in range(1000000):
r = randint(0, len(ser)-1)
t = time()
ser[r]
pandas_time += time() - t
t = time()
lst[r]
list_time += time() - t
print(pandas_time, list_time)
比仅索引熊猫系列要快得多,但仍比使用python列表慢
.values
使用pd.Series.values Regular List
0.18845057487487793 0.04786252975463867
0.10950899124145508 0.11034011840820312
0.048889875411987305 0.09512066841125488
0.17272686958312988 0.1406867504119873
0.14252233505249023 0.048066139221191406
0.06352949142456055 0.07906699180603027
0.1405477523803711 0.07815265655517578
0.18746685981750488 0.08007645606994629
0.1405184268951416 0.0781564712524414
0.07921838760375977 0.1412496566772461
进行汇总是您需要快速索引熊猫系列的一种方法。尽管.values
看起来更快,但是请记住,索引各个元素时它只会稍微快一点。 Numpy数组将支持更快的花式索引编制,例如具有多个元素的索引编制。
答案 1 :(得分:0)
pandas 对 index 和 reindex 的实现质量很低。 它包含太多的开销。
有关进一步讨论,请参阅以下链接。 https://github.com/pandas-dev/pandas/issues/23735