【问题标题】:How to use multiprocessing for multiple nested for loop in Python?如何在 Python 中对多个嵌套 for 循环使用多处理?
【发布时间】:2021-05-25 23:21:58
【问题描述】:

我有一个类,它有一堆函数来检查数据与一个巨大的数据帧 ~33gb。变量中的每个值都针对数据帧中的一列(比如说 D 列)运行,然后将其附加到数据帧本身以供其他迭代计算值。

无论如何,i 是针对 df.D 运行的,而 j 是针对 df.D 运行的,并且 i 的结果以此类推。我正在尝试查看哪组数字将提供最佳输出。下面是代码外观的sn-p。

program.py
class Test:
    def runTest():
       pass

    def run():
       runTest()
       bunch of if/else statements to check the data
       pd.to_csv to export the result

    def aa(int):
       calculation..

    def bb(int):
       do something

     ...

runTest.py
for i in range(10,25):
    for j in range(45,85):
        for k in range(6,16):
            for l in range(7,21):
                for m in range(65,75):
                    class hello(Test):
                        def runTest():
                            a = aa(i)
                            b = bb(j)
                            ...
                    
                    hello().run()

我已尝试使用 itertools.product 列出该范围内的所有数字。但我不知道如何在我的程序中提取这些值。我希望它具有可扩展性,因为范围会更大,并且会添加更多参数来测试程序。

如何使用 dask 或 multiprocessing 运行这些嵌套的 for 循环,以最大限度地减少运行此任务的时间?或任何其他建议将不胜感激。另外,如果有更好的方法来导出结果。请告诉我。

【问题讨论】:

  • 刚开始:在 for 循环中定义类没有好处 - 只需在顶层声明它。
  • 每列使用.apply(some_func, axis=0) 怎么样?目前的代码看起来确实很难优化。
  • @jsbueno 一旦我找出“最佳”数字。不需要所有的 for 循环。它只是运行程序的类。
  • @SultanOrazbayev 所以 .apply(some_func, axis=0) 为每一列并预填充数据框并运行程序?唯一的问题是 i = 11 和 i = 12 等的数据会有所不同。并且有这么多的迭代。我无法有效地存储/读取数据。

标签: python pandas multiprocessing nested-loops dask


【解决方案1】:

您似乎正在进行某种网格搜索/参数探索。在这种情况下,我会避免使用类和嵌套循环。

要设置所有参数的列表,您可以使用itertools.product,例如:

from itertools import product

for i, j in product(range(10), range(20)):
# run calculations

要并行迭代多个参数值,我会使用delayed

import dask
from itertools import product

@dask.delayed
def try_calc(i,j,k):
    df = pd.read_csv(my_csv_file)
    # run calculations
    df.to_csv(results_file)

results = dask.compute([
    try_calc(i,j,k) for i,j,k in product(range(10), range(20), range(30))
])

【讨论】:

  • 谢谢。我用一个小样本试了一下,这似乎奏效了。结果 = dask.compute([ try_calc(i,j,k) for i,j,k in product(range(10), range(20), range(30)) ])
  • 太好了,我还建议使用相对较小的组合(以便将产品的长度保持在 10K 左右)。
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2021-04-13
  • 1970-01-01
  • 2015-10-15
  • 2020-09-25
  • 2023-04-06
相关资源
最近更新 更多