【问题标题】:Multiprocessing my Loop / Iteration ( Try...Except)多处理我的循环/迭代(尝试...除外)
【发布时间】:2019-11-01 22:02:24
【问题描述】:

我正在将一种化学符号转换为另一种类型。我的列表有超过 6k 不同的名称要转换,而且需要很长时间。如何使用多处理?我试图实现自己,但我是菜鸟。也欢迎其他代码优化!

我尝试自己实现多处理,但我是菜鸟。

def resolve(str_input, representation):
    import cirpy
    return cirpy.resolve(str_input, representation)

compound_list = []
smiles_list = []

for index, row in df_Verteilung.iterrows():

    try:
        actual_smiles = resolve(row['Compound'], 'smiles')

    except:
        actual_smiles = 'Error'

    print('\r', row['Compound'], actual_smiles, end='')

    compound_list.append(row['Compound'])
    smiles_list.append(actual_smiles)

df_new = pd.DataFrame({'Compound' : compound_list, 'SmilesCode' : smiles_list})
df_new.to_csv(index=False)

【问题讨论】:

    标签: python pandas python-multiprocessing


    【解决方案1】:

    尝试使用来自多处理的池:

        from multiprocessing import Pool
    
        def resolve(str_input, representation):
            try:
                import cirpy
                res =  cirpy.resolve(str_input, representation)
            except:
                res = "Error"
    
            print('\r', str_input, res, end='')
            return (str_input, res)
    
        n = 5
    
        with Pool(processes=n) as pool:
            compounds_smiles_list = pool.starmap(resolve, [(row['Compound'], 'smiles') for index, row in df_Verteilung.iterrows()])
    
        compound_list = [elem[0] for elem in compounds_smiles_list]
        smiles_list = [elem[1] for elem in compounds_smiles_list]
    
        df_new = pd.DataFrame({'Compound' : compound_list, 'SmilesCode' : smiles_list})
        df_new.to_csv(index=False)
    

    使用变量n 可以控制池的大小。或者,您可以将 Pool 构造函数留空,并根据您的系统选择优化的工作人员数量。

    一些解释:

    Pool

    starmap

    【讨论】:

    • @Mr.Chang 是否实现了运行时间的改进?
    • 之前是 1 小时,现在只有 10 分钟!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2016-11-14
    相关资源
    最近更新 更多