В вашем коде есть все, что нужно для работы на многоядерном процессоре, использующем более одного ядра.Но это беспорядок.Я не знаю, какую проблему вы пытаетесь решить с помощью кода.Также я не могу запустить его, так как я не знаю, что такое 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 столбцовмои данные) с пустышкой для циклов (для выполнения связанных с процессором операций) и попробовал его.Я получил 100% загрузки процессора (у меня 4-ядерный процессор i5), что, естественно, привело к примерно в 4 раза более быстрым вычислениям (20 секунд против 74 секунд) по сравнению с реализацией одного процесса в цикле for.
EDIT.
Полный код, который я использовал для многопроцессорной обработки (я использую 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))