首页 > 解决方案 > Python:有没有更快的方法在 for 循环中过滤数据帧

问题描述

我在 python 中的一个元组上有一个 for 循环,它是一个数据帧的索引。然后将索引下的所有值相加。

例子:

t3 = time()
for row in list_of_index:
    a=[]
    if row[-1]!='end':
        a=df1.loc[row[:7]].to_numpy()
    b=df2.loc[row[:6]].to_numpy()
    print(solver.add_constraint(solver.sum(dvSupportedOuts[row[0], row[6],row[1], 
 row2[0],row[2],row2[1],row2[2],row[3],row[4] ,row2[3],row[5],row2[4],row2[5],row2[6] ,row2[7],row2[8]] 
                                     for row2 in np.reshape(a, (-1, 11))) 
        ==                solver.sum(dvSupportedOuts[row[0], row2[0], row[1], 
                                     row[2], row2[1],row[3],row[4],row2[2],row2[3],row[5],row2[4],row2[5],row2[6],row2[7],row2[8],row2[9]] 
                                     for row2 in np.reshape(b, (-1, 12)))#size of step_sequence
        + dvMBDown[row[0], row[6], row[1], row[2],row[3],row[4],row[5]]
        - dvMBUp[row[0], row[6], row[1], row[2],row[3],row[4],row[5]]))
print(area_name+" mb:", round((time()-t3), 1), "s")

这是我正在制定的约束,它返回超过 100k 的约束。在线程化时运行此代码需要 40 分钟。过滤器有助于为在solver.sum() 中运行的循环返回更少的数据。有没有更快的方法来过滤 for 循环中的值?(这是为创建 docplex 约束而完成的)谢谢

标签: pythonperformancecplexdocplex

解决方案


我能够让它快 18 倍,主要时间花在过滤器 (.loc()) 上。首先,我将我的索引从多索引更新为单个索引,该索引是所有索引列的连接。这导致速度提高了 3 倍。然后我将我的数据框更改为字典,它导致总速度提高了 15 倍。现在我可以在 3 分钟而不是 45 分钟内创建模型约束。此外,我已经在索引的 1 上对它进行了线程化(并行处理)。通常我没有看到使用 add_constrains() 显着提高速度,但有时它会有所帮助。50k 约束在 3 分钟内形成 600k 行的数据如果需要,我可以分享逻辑


推荐阅读