【问题标题】:Python - Running function concurrently (multiple instance)Python - 同时运行函数(多实例)
【发布时间】:2018-11-13 08:16:23
【问题描述】:

我构建了一个小函数,该函数将使用 3rd 方 API 收集一些数据。调用 if def MyFunc(Symbol, Field) 将根据给定的符号返回一些信息。

这个想法是用返回值填充 Pandas df,使用类似的东西:

df['MyNewField'] = df.apply(lamba x: MyFunc(x, 'FieldName'))

所有这些工作但是,每个查询大约需要 100 毫秒 来运行。这似乎很快,直到您意识到您可能有 30,000 或更多的事情要做(3,000 个符号,每个符号有 10 个字段)。

我想知道是否有一种方法可以同时运行它,因为每个请求都是独立的?我不是在寻找多处理器等库,而是一种同时对第三方进行多个查询的方法,以减少收集所有数据所需的时间。 (另外,我想这会改变用于存储所有接收到的数据的初始结构——我不介意一开始不使用 Apply 和我的数据框,而是将接收到的数据保存在文本或库类型结构中——)。

注意:虽然我希望我可以将 MyFunc 更改为一次请求多个符号/字段,但这不能在所有情况下都完成(这意味着某些字段不允许这样做,并且单个请求是唯一的方法)。这就是我关注并发执行而不是更改 MyFunc 的原因。

谢谢!

【问题讨论】:

  • "一种同时对第三方进行多个查询以减少收集所有数据所需时间的方法" -- 如果要这样做,则需要更改MyFunc一次处理多个查询。否则,唯一的选择是多处理。
  • @cheersmate 这是我的主要目标。我可以向 MyFunc 传递一个符号列表和许多字段,而不仅仅是对每个字段进行查询。但是,这涉及到问题都知道您要提前执行的所有查询。由于我可以同时执行多个查询,我的目标是首先尝试查看 Python 是否可以运行多个 MyFunc 实例以某种方式保存返回的数据。这是我在这里提出问题的主要目的。

标签: python concurrency multiple-instances


【解决方案1】:

有许多库可以并行化 pandas 数据框。但是,我更喜欢原生多处理池来做同样的事情。另外,我使用 tqdm 来了解进度。

import numpy as np
from multiprocessing import cpu_count, Pool

cores = 4 #Number of CPU cores on your system
partitions = cores #Define as many partitions as you want

def partition(data, num_partitions):
    partition_len = int(len(data)/num_partitions)
    partitions = []

    num_rows = 0
    for i in range(num_partitions-1):
        partition = data.iloc[i*partition_len:i*partition_len+partition_len]
        num_rows = num_rows + partition_len
        partitions.append(partition)

    partitions.append(data.iloc[num_rows:len(data)])
    return partitions

def parallelize(data, func):
    data_split = partition(data, partitions)
    pool = Pool(cores)
    data = pd.concat(pool.map(func, data_split))
    pool.close()
    pool.join()
    return data

df['MyNewField'] = parallelize(df['FieldName'], MyFunc)

【讨论】:

  • 谢谢。并行计算是这里的解决方案吗?我的印象是创建多个对象并让它们中的每一个进行查询。我对并行计算的理解是,它有助于使该过程更加高效,但我很高兴操作系统能够拆分工作(想想 Excel,当您在多个单元格上拥有一个函数时,它们都同时独立运行)。
  • 这里的分区将数据帧分成多个对象。然后根据核心数量创建进程。每个进程独立选择一个数据框分区并执行 MyFunc 转换。
猜你喜欢
  • 2015-12-21
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多