【问题标题】:How to apply multiprocessing technique in python for-loop?如何在 python for-loop 中应用多处理技术?
【发布时间】:2017-02-11 08:14:15
【问题描述】:

我有一长串用户(大约 200,000)和一个相应的数据框 df 及其属性。现在我想编写一个 for 循环来测量用户的成对相似性。代码如下:

df2record = pd.DataFrame(columns=['u1', 'u2', 'sim'])
for u1 in reversed(user_list):
    for u2 in reversed(list(range(1, u1))):
        sim = measure_sim(df[u1], df[u2]))
        if sim < 0.6:
            continue
        else:
            df2record = df2record.append(pd.Series([u1, u2, sim], index=['u1', 'u2', 'sim']), ignore_index=True)

现在我想用多处理运行这个 for 循环,并且我已经阅读了一些教程。但是我仍然不知道如何正确处理它。看来我应该先设置合理数量的进程,比如6。然后我应该将每个循环输入一个进程。但问题是我如何知道某个进程中的任务已经完成,从而可以开始一个新的循环?你能帮我解决这个问题吗?提前谢谢你!

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

    首先,我不建议对这么小的数据使用多处理。尤其是当您使用数据框时。因为数据框有它自己的很多功能,可以在很多方面帮助你。你只需要编写正确的循环。

    使用:multiprocessing.Pool

    只需将用户列表作为迭代器(process_size=list_of_user) 传递给 pool.map() 。您只需稍作调整即可创建迭代器。

    from multiprocessing import Pool
    with Pool() as pool:
         pool = multiprocessing.Pool(processes=6)
         pool.map(function, iterator)
    

    【讨论】:

      【解决方案2】:

      您可以使用multiprocessing.Pool,它提供了方法map,将进程池映射到给定的可迭代对象上。下面是一些示例代码:

      def pairGen():
          for u1 in reversed(user_list):
              for u2 in reversed(list(range(1, u1))):
                  yield (u1, u2)
      
      def processFun(pair):
          u1, u2 = pair
          sim = measure_sim(df[u1], df[u2]))
          if sim < 0.6:
              return None
          else:
              return pd.Series([u1, u2, sim], index=['u1', 'u2', 'sim'])
      
      def main():
          with multiprocessing.Pool(processes=6) as pool:
             vals = pool.map(processFun, pairGen())
      
          df2record = pd.DataFrame(columns=['u1', 'u2', 'sim'])
          for v in vals:
             if vals != None:
                 df2record = df2record.append(v, ignore_index=True)
      

      【讨论】:

      • 感谢您的回答!但是我遇到了这样的错误:TypeError: processFun() missing 1 required positional argument: 'pair' 你知道如何正确映射输出吗?谢谢!
      • 奇怪,this 在 Python 3.4.2 和 3.5.2 上为我工作。你用的是什么版本的 Python?
      • 我的版本是python 3.5
      • 谢谢!对不起,我犯了一个愚蠢的错误。我修好了它。但是内核已经死了。但是只有一个进程时它并没有死,尽管它很慢。你有什么想法吗?谢谢!
      • 它已经死了,因为你的 python 进程正在占用你的整个 CPU。如果您希望您的 PC 负责,最好使用 N-1 个进程,其中 N 是您的 CPU 内核数。它被作为processes 参数放到multiprocessing.Pool 构造函数中。
      猜你喜欢
      • 1970-01-01
      • 2017-04-29
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多