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

如何在numba或其他python库中并行化for循环代码?,python,python-3.x,pandas,python-multiprocessing,numba,Python,Python 3.x,Pandas,Python Multiprocessing,Numba,我有如下代码: 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) prin

我有如下代码:

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以并行方式处理每个列来提高速度,我使用多处理编写了以下代码,但没有帮助

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的结果,我有另一个函数来计算分数。我在上述代码中给出了这两个函数。上述函数中的递增操作用于验证r它是否会起作用。这是我的意图。在代码的第一部分中,它是以串行方式进行的,而我需要将for循环的这个区域并行化,以便以并行方式处理多个列).

如多处理模块编程指南中所述,如果uuu name uuu=='uuu main uuu':,则必须使用
。这是您提供的第二个代码,应该如下所示:

# 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笔记本中运行代码,您必须将函数放入模块中(最简单的情况是,
.py
文件位于
.ipynb
脚本所在的文件夹中)。当然,您应该导入自定义模块。这为我解决了问题。

我完全不明白这段代码应该做什么。这段代码是一个抽象示例。基本思想是我必须获取数据帧中的每一列并执行DBSCAN算法。基于DBSCAN的结果,我有另一个函数来计算这方面的分数。这是我的意图。在代码的第一部分,它是以串行方式进行的,而我需要将for循环的这个区域并行化,以便我可以以并行方式处理多个列。您可以尝试使用多处理模块。我只使用了multiprocessing.pool中的threadpool,但它相当有效地并行了我的应用程序。我绝对不是这方面的专家。只是分享我在自己的项目中发现的有用的东西。你能发布一个代表你实际问题的例子吗?这完全取决于能否通过矢量化加快速度。您的示例根本没有使用数据帧,它只是在屏幕上打印一些内容。请发布一个。我在DBSCAN和评分功能中只使用了矢量化方法。但我需要优化这个for循环,通过在parallel@Vamshi对我运行了你的代码,得到了无限的运行时间,但没有结果。然后我做了这个修正,得到了输出
[8,8,8]
,没有无限执行。我使用Python 3.6/Win10。@Vamshi刚刚在另一台机器(Python 3.6/win7)上重试。结果是一样的-
如果
修复了这个问题,我试过了。但它在我的系统上不起作用。它是Windows10和python 3.6。我只是想看看它是否能发挥作用。然后,剩下的事情,我可以处理。我认为操作系统有问题。在这里我发现了一些东西:你是在python笔记本中使用的还是其他什么?