Если предположить, что foo1
или foo2
привязано к процессору, многопоточность не увеличивает время выполнения ... фактически, обычно это ухудшает ... для получения дополнительной информации см. презентацию Дэвида Бизли на PyCon2010 на глобальном замке интерпретатора / Pycon2010 GIL слайды . Эта презентация очень информативна, я настоятельно рекомендую ее всем, кто пытается распределить нагрузку между ядрами процессора.
Лучший способ улучшить производительность - это многопроцессорный модуль
Предполагая, что между foo1()
и foo2()
не требуется общего состояния, сделайте это, чтобы улучшить производительность выполнения ...
from multiprocessing import Process, Queue
import time
def foo1(queue, arg1):
# Measure execution time and return the total time in the queue
print "Got arg1=%s" % arg1
start = time.time()
while (arg1 > 0):
arg1 = arg1 - 1
time.sleep(0.01)
# return the output of the call through the Queue
queue.put(time.time() - start)
def foo2(queue, arg1):
foo1(queue, 2*arg1)
_start = time.time()
my_q1 = Queue()
my_q2 = Queue()
# The equivalent of x = foo1(50) in OP's code
p1 = Process(target=foo1, args=[my_q1, 50])
# The equivalent of y = foo2(50) in OP's code
p2 = Process(target=foo2, args=[my_q2, 50])
p1.start(); p2.start()
p1.join(); p2.join()
# Get return values from each Queue
x = my_q1.get()
y = my_q2.get()
print "RESULT", x, y
print "TOTAL EXECUTION TIME", (time.time() - _start)
На моей машине это приводит к:
mpenning@mpenning-T61:~$ python test.py
Got arg1=100
Got arg1=50
RESULT 0.50578212738 1.01011300087
TOTAL EXECUTION TIME 1.02570295334
mpenning@mpenning-T61:~$