如何在numba或python的其他库中并行化我的for循环代码?

问题描述 投票:-2回答:1

我的代码如下:

import pandas as pd
import multiprocessing as mp

a = {'a' : [1,2,3,1,2,3], 'b' : [5,6,7,4,6,5], 'c' : ['dog', 'cat', 'tree','slow','fast','hurry']}
df = pd.DataFrame(a)

def performDBSCAN(feature): 
    value=scorecalculate(feature)
    print(value)
    for ele in range(4):
        value=value+1
        print('here value is ', value)
    return value

def processing(feature):
    result1=performDBSCAN(feature)
    return result1

def scorecalculate(feature):
    scorecal=0
    for val in ['a','b','c','d']:
        print('alpha is:', val )
        scorecal=scorecal+1
    return scorecal

columns = df.columns
for ele in df.columns:
    processing(ele)

上面的代码以串行方式执行。我想通过使用python以并行方式处理每个col来加快速度,我使用多处理编写了以下代码,但没有帮助。

import pandas as pd
import multiprocessing as mp     

def performDBSCAN(feature): 
    value=scorecalculate(feature)
    print(value)
    for ele in range(4):
        value=value+1
        print('here value is ', value)
    return value

def scorecalculate(feature):
    scorecal=0
    for val in ['a','b','c','d']:
        print('alpha is:', val )
        scorecal=scorecal+1
    return scorecal

def processing(feature):
    result1=performDBSCAN(feature)
    return result1

a = {'a' : [1,2,3,1,2,3], 'b' : [5,6,7,4,6,5], 
'c' : ['dog','cat','tree','slow','fast','hurry']}
df = pd.DataFrame(a)
columns = df.columns
pool = mp.Pool(4)
resultpool = pool.map(processing, columns)

我看不到任何输出,内核连续运行没有任何输出?可能是什么问题? numba中的其他图书馆是否有其他方法可以做到这一点? (注意:这段代码是一个正常的例子。基本的想法是我必须在数据帧中获取每一列并执行DBSCAN算法。根据DBSCAN的结果,我有另一个函数来计算得分。我给了这两个上面代码中的函数。上述函数中的递增操作用于验证它是否转向函数。这是我的意图。在代码的第一部分中,它是以串行方式进行的,而我需要并行化for循环的这个区域,以便我可以并行处理多个列)。

python python-3.x pandas python-multiprocessing numba
1个回答
1
投票

您必须使用if __name__ == '__main__':,如多处理模块https://docs.python.org/3/library/multiprocessing.html#multiprocessing-programming的编程指南中所述。这是您提供的第二个代码应如下所示:

# imports

# functions

if __name__ == '__main__':
    a = {
        'a': [1, 2, 3, 1, 2, 3],
        'b': [5, 6, 7, 4, 6, 5],
        'c': ['dog', 'cat', 'tree', 'slow', 'fast', 'hurry']}
    df = pd.DataFrame(a)
    pool = mp.Pool(4)
    result = pool.map(processing, df.columns)
    print(result)

输出:

[8, 8, 8]

编辑:

要在Jupyter Notebook中运行代码,您必须将函数放入一个模块中(最简单的情况是它是.py脚本所在文件夹中的.ipynb文件)。然后你应该导入你的自定义模块。这解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.