Поскольку вы используете многопроцессорность, а не многопоточность, ваша проблема с производительностью не связана с GIL (глобальная блокировка интерпретатора Python).
Я нашел интересную ссылку, объясняющую это на примере, вы можете найти ее внижняя часть этого ответа.
GIL не препятствует запуску процесса на другом процессоре компьютера.Это просто позволяет только одному потоку запускаться одновременно в интерпретаторе.
Таким образом, многопроцессорная обработка, а не многопоточность, позволит вам достичь истинного параллелизма.
Позволяет понять это через некоторый сравнительный анализ, потому что только это приведетвам верить тому, что сказано выше.И да, это должен быть способ учиться - испытать это, а не просто прочитать или понять это.Потому что, если вы что-то испытали, никакие аргументы не могут убедить вас в противоположных мыслях.
import random
from threading import Thread
from multiprocessing import Process
size = 10000000 # Number of random numbers to add to list
threads = 2 # Number of threads to create
my_list = []
for i in xrange(0,threads):
my_list.append([])
def func(count, mylist):
for i in range(count):
mylist.append(random.random())
def multithreaded():
jobs = []
for i in xrange(0, threads):
thread = Thread(target=func,args=(size,my_list[i]))
jobs.append(thread)
# Start the threads
for j in jobs:
j.start()
# Ensure all of the threads have finished
for j in jobs:
j.join()
def simple():
for i in xrange(0, threads):
func(size,my_list[i])
def multiprocessed():
processes = []
for i in xrange(0, threads):
p = Process(target=func,args=(size,my_list[i]))
processes.append(p)
# Start the processes
for p in processes:
p.start()
# Ensure all processes have finished execution
for p in processes:
p.join()
if __name__ == "__main__":
multithreaded()
#simple()
#multiprocessed()
Дополнительная информация
Здесь Вы можете найти источник этой информации и более подробное техническое объяснение (бонус: там также есть цитаты Гвидо Ван Россума :))