【发布时间】:2019-08-01 01:42:50
【问题描述】:
我有一个返回字典的函数。该函数通过根据数据帧中的数组计算值来工作。
数据框有大约 1000,000 行,如下所示:
col1
row1 [2, 3, 44, 89.6,...]
row2 [10, 4, 33.3, 1.11,...]
row3 [3, 4, 3, 2.6, 5.9, 8, 10,...]
我的函数接受每一行中的每个数组,进行一些计算并根据这些计算返回一个字典。但是,它非常缓慢。有很多数据需要筛选,我很欣赏,但有什么方法可以提高速度吗?
问题 数据框很长。每个数组可以包含 100 多个值。范围约为 10-80。
我的代码如下所示:
list1 = []
for i in df.itertuples():
list1.append(list(function(i.data).values()))
这里的想法是我遍历“df”中的每一行,将我的函数应用于“数据”列并将结果附加到列表“list1”。
功能说明
我的函数计算了一些非常基本的东西。它接受一个数组作为参数并根据该数组计算东西,例如多长时间,数组中的平均值,数组的最小值和最大值。我计算 8 个值并将它们存储在字典中。我的函数做的最后一件事是查看这些计算值并以布尔值的形式向字典添加最终键。
【问题讨论】:
-
如果您将列表存储在数据框的单元格中,那么不,您无法加快速度。如果您选择不同的数据结构,您也许可以这样做
-
可以添加你的功能吗?或者添加一些示例功能?是否可以将列表转换为标量,这意味着
[2, 3, 44, 89.6,...]转换为列,其他列表类似?也许那时有必要改变你的功能。 -
瓶颈几乎可以肯定是将
function应用于容器的每个元素(部分);容器的类型(数据框、列表等)并不重要。 -
如果您想将函数应用于独立于所有其他行的每一行,那么您可以使用multiprocessing 稍微加快它的速度。请注意,仅当您(在行上)执行复杂计算时才适用,否则可能会减慢您的速度。
-
根据您的函数的功能,使用Cython 也可能很有趣。我们需要更多细节来正确回答这个问题。