Как я могу распараллелить мой код цикла в Numba или в другой библиотеке Python? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть такой код:

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, у меня есть другая функция для вычисления оценки для этого. Я дал эти двафункции в приведенном выше коде. Инкрементные операции в вышеуказанных функциях используются для проверки, чтобы увидеть, идет ли он в функцию или нет. Это было мое намерение. Здесь, в первой части кода, он принимает в последовательном порядке, тогда как мне нужно распараллелитьэта область цикла for, чтобы я мог обрабатывать несколько столбцов параллельно).

1 Ответ

0 голосов
/ 14 сентября 2018

Вы должны использовать 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сценарий находится).Тогда вы должны импортировать свой пользовательский модуль, конечно.Это решает проблему для меня.

...