Я использовал пул из двух рабочих, чтобы разделить сумму в функции с многопроцессорной обработкой Python, но время не ускоряется, есть ли что-то, что мне не хватает?
Ответ заключался в том, что сбор данных для отправки процессорам и их распаковка стоят слишком дорого, чтобы свести на нет преимущества использования многопроцессорности. И действительно, использование простого цикла суммирования или проверки простоты, предложенное @MathiasR.Jessen, было бы лучшим примером, который не включал бы эти действия травления.
Теперь для модулей threading и asyncio у меня есть примеры с использованием time.sleep, которые работают как положено. Тем не менее, я подумал о том, чтобы подобрать что-нибудь очень простое в качестве примера ввода-вывода, а не просто команды сна + печати. Один из примеров, о котором я думал, заключался в том, чтобы составить большой список чисел и поставить перед собой две задачи: прочитать этот длинный список, а также позаботиться о сне. Например, список целых чисел от 10**7 до 10**8. Если предположить, что чтение всех его записей с помощью простого цикла for занимает 1 секунду, то задача, которая читает этот список, приостанавливает 5 секунд, а затем снова читает его, должна занять около 6 секунд. Вторая задача, только чтение этого списка, должна занять всего 1 секунду. Таким образом, выполнение этих двух задач в последовательном порядке займет около 7 секунд.
Код: Выделить всё
import time
big_data = [ i for i in range( 10 ** 7, 10 ** 8 ) ]
def task1():
for data in big_data:
data
time.sleep( 5 )
for data in big_data:
data
def task2():
for data in big_data:
data
st = time.time()
task1()
task2()
et = time.time()
print( f"It took { et - st } seconds to do the two tasks." )
Код: Выделить всё
import time
import threading
big_data = [ i for i in range( 10 ** 7, 10 ** 8 ) ]
def task1():
for data in big_data:
data
time.sleep( 5 )
for data in big_data:
data
def task2():
for data in big_data:
data
t1 = threading.Thread( target = task1, args = () )
t2 = threading.Thread( target = task2, args = () )
st = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
et = time.time()
print( f"It took { et - st } seconds to do the two tasks." )
Код: Выделить всё
import time
import asyncio
big_data = [ i for i in range( 10 ** 7, 10 ** 8 ) ]
async def task1():
for data in big_data:
data
await asyncio.sleep( 5 )
for data in big_data:
data
async def task2():
for data in big_data:
data
async def all_together():
await asyncio.gather( task1(), task2() )
st = time.time()
asyncio.run( all_together() )
et = time.time()
print( f"It took { et - st } seconds to do the two tasks." )
Затем я попробовал прочитать, но не из списка, а только счетчики цикла for, и на этот раз asyncio тоже занимает больше времени, чем последовательный запуск!
Код: Выделить всё
import time
def task1():
for i in range( 10 ** 7, 10 ** 8 ):
i
time.sleep( 5 )
for i in range( 10 ** 7, 10 ** 8 ):
i
def task2():
for i in range( 10 ** 7, 10 ** 8 ):
i
st = time.time()
task1()
task2()
et = time.time()
print( f"It took { et - st } seconds to do the two tasks." )
Код: Выделить всё
import time
import threading
def task1():
for i in range( 10 ** 7, 10 ** 8 ):
i
time.sleep( 5 )
for i in range( 10 ** 7, 10 ** 8 ):
i
def task2():
for i in range( 10 ** 7, 10 ** 8 ):
i
t1 = threading.Thread( target = task1, args = () )
t2 = threading.Thread( target = task2, args = () )
st = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
et = time.time()
print( f"It took { et - st } seconds to do the two tasks." )
Код: Выделить всё
import time
import asyncio
async def task1():
for i in range( 10 ** 7, 10 ** 8 ):
i
await asyncio.sleep( 5 )
for i in range( 10 ** 7, 10 ** 8 ):
i
print( "done" )
async def task2():
for i in range( 10 ** 7, 10 ** 8 ):
i
async def all_together():
await asyncio.gather( task1(), task2() )
st = time.time()
asyncio.run( all_together() )
et = time.time()
print( f"It took { et - st } seconds to do the two tasks." )
Мобильная версия