Проблема со скоростью многопроцессорной обработки Python

У меня есть вложенный цикл for формы

while x<lat2[0]:
    while y>lat3[1]:
        if (is_inside_nepal([x,y])):
            print("inside")
        else:
            print("not")
        y = y - (1/150.0)
    y = lat2[1]
    x = x + (1/150.0)
#here lat2[0] represents a large number

Теперь это обычно занимает около 50 секунд. И я изменил этот цикл на многопроцессорный код.

def v1find_coordinates(q):
  while not(q.empty()):

    x1 = q.get()
    x2 = x1 + incfactor
    while x1<x2:
        def func(x1): 
            while y>lat3[1]:
                if (is_inside([x1,y])):
                    print x1,y,"inside"
                else:
                    print x1,y,"not inside"
                y = y - (1/150.0)

        func(x1)
        y = lat2[1]
        x1 = x1 + (1/150.0)

incfactor = 0.7
xvalues = drange(x,lat2[0],incfactor)
#this drange function is to get list with increment factor as decimal
cores = mp.cpu_count()
q = Queue()
for i in xvalues:
    q.put(i)
for i in range(0,cores):
    p = Process(target = v1find_coordinates,args=(q,) )
    p.start()
    p.Daemon = True
    processes.append(p) 
for i in processes:
    print ("now joining")
    i.join()   

Этот многопроцессорный код также занимает около 50 секунд на выполнение. Это означает, что между ними нет разницы во времени.

Я также пробовал использовать пулы. Я также управлял размером куска. Я гуглил и искал через другой stackoverflow. Но не могу найти удовлетворительного ответа.

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

Даст ли реализация на C из Python более быстрые результаты?

Я не ожидаю радикальных результатов, но по здравому смыслу можно сказать, что работа на 4 ядрах должна быть намного быстрее, чем работа на 1 ядре. Но я получаю аналогичные результаты. Любая помощь будет оценена по достоинству.


person Ritesh Jung Thapa    schedule 01.07.2016    source источник
comment
Очередь может быть очередью потоков (очередью импорта) вместо многопроцессорной? (из многопроцессорной очереди импорта)   -  person Hugo Walter    schedule 01.07.2016
comment
Я все еще изучаю многопроцессорность, но я читал, что задачи, ориентированные на процессор, ничего не увеличивают в скорости, если вы используете многопоточность. Я знаю, вы сказали, что уже играли в бильярд, но, может быть, еще раз попробуете.   -  person Will.Evo    schedule 01.07.2016
comment
@HugoWalter Нет, это не очередь импорта   -  person Ritesh Jung Thapa    schedule 02.07.2016
comment
@Will.Evo Нет, здесь я не использую многопоточность. Я создал процессы. А при проверке там 4-5 процессов.   -  person Ritesh Jung Thapa    schedule 02.07.2016


Ответы (1)


Кажется, вы используете очередь потоков (из Queue import Queue). Это не работает должным образом, поскольку Process использует fork() и клонирует всю очередь в каждый рабочий процесс.

Использовать:

from multiprocessing import Queue

person Hugo Walter    schedule 01.07.2016
comment
Я сделал из многопроцессорной очереди импорта, а не очереди импорта - person Ritesh Jung Thapa; 02.07.2016