python - 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 约束而完成的)谢谢
解决方案
我能够让它快 18 倍,主要时间花在过滤器 (.loc()) 上。首先,我将我的索引从多索引更新为单个索引,该索引是所有索引列的连接。这导致速度提高了 3 倍。然后我将我的数据框更改为字典,它导致总速度提高了 15 倍。现在我可以在 3 分钟而不是 45 分钟内创建模型约束。此外,我已经在索引的 1 上对它进行了线程化(并行处理)。通常我没有看到使用 add_constrains() 显着提高速度,但有时它会有所帮助。50k 约束在 3 分钟内形成 600k 行的数据如果需要,我可以分享逻辑
推荐阅读
- java - 如何防止应用程序在用户输入字符串而不是整数时计算 n 数的平均值时崩溃
- reactjs - 是的 date min 不适用于 Formik DatePicker
- mysql - 使用 group by 子句更新同一张表的 N 条记录
- delphi - 运行时创建的对象中的临时行
- api - 如何使用 jquery 将视频直接从客户端浏览器上传到 Viemeo?
- jhipster - 如何检查 JHipster 环境
- html - 如果文本很长,我想加点
- python - 使用带有 json bdoy 的请求 multipartencoder 上传 Python 文件
- vba - 字符串处理参数
- c++ - 返回 char * 而不是字符串