繁体   English   中英

Python-并发运行函数(多个实例)

[英]Python - Running function concurrently (multiple instance)

我构建了一个小函数,该函数将使用第三方API收集一些数据。 如果def MyFunc(Symbol, Field)调用,它将基于给定的符号返回一些信息。

想法是使用类似以下内容的返回值填充Pandas df:

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

所有这些都有效, 每个查询大约需要100毫秒才能运行。 这似乎很快,直到您意识到自己可能要做30,000或更多(3,000个带有10个字段的符号供初学者使用)。

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

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

谢谢!

有很多库可以并行化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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM