0

Я написал функцию, которая возвращает кадр данных Pandas (образец в виде строки и дескриптора в виде столбцов) и принимает входные данные в виде списка пептидов (биологическая последовательность как данные строк). «my_function (pep_list)» принимает pep_list как параметр и возвращает фрейм данных. он перебирает eache пептидной последовательности из pep_list и вычисляет дескриптор и объединяет все данные в виде панда кадра данных и возвращает ДФ:Параллельный код Python

pep_list = [DAAAAEF,DAAAREF,DAAANEF,DAAADEF,DAAACEF,DAAAEEF,DAAAQEF,DAAAGEF,DAAAHEF,DAAAIEF,DAAALEF,DAAAKEF] 

пример:

Я хочу parallelising этого кода с заданным алгоритмом сильфоном:

1. get the number of processor available as . 
    n = multiprocessing.cpu_count() 

2. split the pep_list as 
    sub_list_of_pep_list = pep_list/n 

    sub_list_of_pep_list = [[DAAAAEF,DAAAREF,DAAANEF],[DAAADEF,DAAACEF,DAAAEEF],[DAAAQEF,DAAAGEF,DAAAHEF],[DAAAIEF,DAAALEF,DAAAKEF]] 

4. run "my_function()" for each core as (example if 4 cores) 

    df0 = my_function(sub_list_of_pep_list[0]) 
    df1 = my_function(sub_list_of_pep_list[1]) 
    df2 = my_functonn(sub_list_of_pep_list[2]) 
    df3 = my_functonn(sub_list_of_pep_list[4]) 

5. join all df = concat[df0,df1,df2,df3] 

6. returns df with nX speed. 

Пожалуйста, предложите мне лучшую подходящую библиотеку для реализации этого метода.

спасибо и приветствуем.

Updated 

С некоторым чтением я могу записать код, который работает в соответствии с моими ожиданиями, как 1. без parallelising это занимает ~ 10 вторые для 10 пептидной последовательности 2. с двумя процессами она занимает ~ 6 секунд в течение 12 пептида 3. с четырьмя процессами она занимает ~ 4 секунды в течение 12 пептидов

from multiprocessing import Process 

def func1(): 
    structure_gen(pep_seq = ["DAAAAEF","DAAAREF","DAAANEF"]) 

def func2(): 
    structure_gen(pep_seq = ["DAAAQEF","DAAAGEF","DAAAHEF"]) 


def func3(): 
    structure_gen(pep_seq = ["DAAADEF","DAAALEF"]) 

def func4(): 
    structure_gen(pep_seq = ["DAAAIEF","DAAALEF"]) 

if __name__ == '__main__': 
    p1 = Process(target=func1) 
    p1.start() 
    p2 = Process(target=func2) 
    p2.start() 
    p3 = Process(target=func1) 
    p3.start() 
    p4 = Process(target=func2) 
    p4.start() 
    p1.join() 
    p2.join() 
    p3.join() 
    p4.join() 

, но этот код легко работать с 10 пептида, но не в состоянии реализовать его для PEP_list содержит 1 миллион пептид

спасибо

+0

процесса (цель = my_function, Args = (each_item_in_sub_list,)) начать() Вы можете икру больше процессов, чем количество процессоров – akalikin

+0

Пожалуйста, объясните подробно, если возможно благодаря – jax

ответ

3

multiprocessing.Pool.map - это то, что вы ищете.
Попробуйте это:

from multiprocessing import Pool 

# I recommend using more partitions than processes, 
# this way the work can be balanced. 
# Of course this only makes sense if pep_list is bigger than 
# the one you provide. If not, change this to 8 or so. 
n = 50 

# create indices for the partitions 
ix = np.linspace(0, len(pep_list), n+1, endpoint=True, dtype=int) 

# create partitions using the indices 
sub_lists = [pep_list[i1:i2] for i1, i2 in zip(ix[:-1], ix[1:])] 

p = Pool() 
try: 
    # p.map will return a list of dataframes which are to be 
    # concatenated 
    df = concat(p.map(my_function, sub_lists)) 
finally: 
    p.close() 

Бассейн будет автоматически содержать столько процессов, сколько доступные ядра. Но вы можете переписать этот номер, если хотите, просто взгляните на документы.

+0

останавливается с ошибкой «Ошибка типа:. LINSPACE() получили неожиданный keyword argument 'dtype' " – jax

+0

@jax Какая у вас версия numpy? Этот аргумент новый в 1.9 ... но есть обходное решение, попробуйте 'np.linspace (0, len (pep_list), n + 1, endpoint = True) .astype (int)' – swenzel

+0

спасибо за ваш комментарий, у меня есть чтобы обойти ваш код, чтобы оптимизировать его для моего случая, на самом деле его рабочий быстрый, обычный код занимает ~ 12,0 сек для вычисления 12 пептидной последовательности, но ваш код занимает ~ 10,0 сек для завершения, даже если я увеличиваю число «n». ваш код работает быстро, но не очень быстро (или, может быть, я не могу его правильно реализовать). я записываю код, который работает в соответствии с моим ожиданием, у меня есть обновление выше, пожалуйста, просмотрите его. – jax

Смежные вопросы