如何在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笔记本中使用的还是其他什么?