簡體   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