我想在我拥有的所有内核上运行我的程序。这是我在程序中使用的代码(这是我完整程序的一部分,不知何故,设法编写了工作流程(。
def ssmake(data):
sslist=[]
for cols in data.columns:
sslist.append(cols)
return sslist
def scorecal(slisted):
subspaceScoresList=[]
if __name__ == '__main__':
pool = mp.Pool(4)
feature,FinalsubSpaceScore = pool.map(performDBScan, ssList)
subspaceScoresList.append([feature, FinalsubSpaceScore])
#for feature in ssList:
#FinalsubSpaceScore = performDBScan(feature)
#subspaceScoresList.append([feature,FinalsubSpaceScore])
return subspaceScoresList
def performDBScan(subspace):
minpoi=2
Epsj=2
final_data = df[subspace]
db = DBSCAN(eps=Epsj, min_samples=minpoi, metric='euclidean').fit(final_data)
labels = db.labels_
FScore = calculateSScore(labels)
return subspace, FScore
def calculateSScore(cluresult):
score = random.randint(1,21)*5
return score
def StartingFunction(prvscore,curscore,fe_select,df):
while prvscore<=curscore:
featurelist=ssmake(df)
scorelist=scorecal(featurelist)
a = {'a' : [1,2,3,1,2,3], 'b' : [5,6,7,4,6,5], 'c' : ['dog', 'cat', 'tree','slow','fast','hurry']}
df2 = pd.DataFrame(a)
previous=0
current=0
dim=[]
StartingFunction(previous,current,dim,df2)
我在scorecal(slisted)
方法中有一个for
循环,它被注释了,每列都执行DBSCAN
,并且必须根据结果计算该特定列的分数(但我尝试在这里使用随机分数在示例中(。这个循环使我的代码运行了更长的时间。因此,我尝试并行化数据帧的每一列,以在系统上的内核上执行DBSCAN,并以上述方式编写代码,这没有给出我需要的结果。我是这个多处理库的新手。我不确定'__main__'
在我的程序中的位置。我还想知道 python 中是否有其他方法可以并行运行。任何帮助,不胜感激。
您的代码具有使用多个内核在多核处理器上运行所需的所有内容。但这是一团糟。我不知道您尝试用代码解决什么问题。我也无法运行它,因为我不知道什么是DBSCAN
.要修复代码,您应该执行几个步骤。
功能scorecal()
:
def scorecal(feature_list):
pool = mp.Pool(4)
result = pool.map(performDBScan, feature_list)
return result
result
是一个列表,其中包含performDBSCAN()
返回的所有结果。您不必手动填充列表。
程序主体:
# imports
# functions
if __name__ == '__main__':
# your code after functions' definition where you call StartingFunction()
我创建了非常简化的代码版本(具有 4 个进程的池来处理我的 8 列数据(和虚拟循环(以实现 CPU 绑定操作(并尝试了它。我获得了 100% 的 CPU 负载(我有 4 核 i5 处理器(,与通过 for 循环实现的单进程实现相比,自然导致计算速度提高了大约 4 倍(20 秒对 74 秒(。
编辑。
我用来尝试多处理的完整代码(我使用Anaconda(Spyder(/Python 3.6.5/Win10(:
import multiprocessing as mp
import pandas as pd
import time
def ssmake():
pass
def score_cal(data):
if True:
pool = mp.Pool(4)
result = pool.map(
perform_dbscan,
(data.loc[:, col] for col in data.columns))
else:
result = list()
for col in data.columns:
result.append(perform_dbscan(data.loc[:, col]))
return result
def perform_dbscan(data):
assert isinstance(data, pd.Series)
for dummy in range(5 * 10 ** 8):
dummy += 0
return data.name, 101
def calculate_score():
pass
def starting_function(data):
print(score_cal(data))
if __name__ == '__main__':
data = {
'a': [1, 2, 3, 1, 2, 3],
'b': [5, 6, 7, 4, 6, 5],
'c': ['dog', 'cat', 'tree', 'slow', 'fast', 'hurry'],
'd': [1, 1, 1, 1, 1, 1]}
data = pd.DataFrame(data)
start = time.time()
starting_function(data)
print(
'running time = {:.2f} s'
.format(time.time() - start))