Андрей Светлов
советуют использовать многопроцессорность на основе модуля multiprocessing
сам недавно задавался тем же вопросом.
я на серьезных приложениях не проверял, но простой пример работает на ура.
Если будет интересно:
from multiprocessing import Process, Queue
import os, time
from random import randint
def f1(list1, list2):
for l1 in list1:
for l2 in list2:
(x,y) = l2.xy # some load
x*x*x*x*x*x*x # some load
def f2(list1, list2):
for l1 in list1:
l1.render()
for l2 in list2:
l2.render()
class ob():
def __init__(self, (x,y)):
self.xy = (x,y)
def render(self):
(x, y) = self.xy # some load
x*x*x*x*x*x*x # some load
if __name__ == '__main__':
npc_list = []
bullets_list = []
i = 0
while i < 1000:
npc = ob((randint(1,100), randint(1,100)))
npc_list.append(npc)
bullet = ob((randint(1,100), randint(1,100)))
bullets_list.append(bullet)
i += 1
while True:
for case in [0,1]:
if case == 0:
t = time.time()
print "PARALLEL calc."
p1 = Process(target=f1, args=(npc_list, bullets_list))
p1.start()
p2 = Process(target=f2, args=(npc_list, bullets_list))
p2.start()
p3 = Process(target=f1, args=(npc_list, bullets_list))
p3.start()
p4 = Process(target=f2, args=(npc_list, bullets_list))
p4.start()
p1.join()
p2.join()
p3.join()
p4.join()
print "Time taken:", time.time() - t
if case == 1:
t = time.time()
print "SERIAL calc."
f1(npc_list, bullets_list)
f2(npc_list, bullets_list)
f1(npc_list, bullets_list)
f2(npc_list, bullets_list)
print "Time taken:", time.time() - t
время выполнения кода на 4х ядерном атлоне
PARALLEL calc.
Time taken: 0.973960161209
SERIAL calc.
Time taken: 3.24503898621
как видите 3.2х кратное увеличение. Однако уверен что функции которые распределяются по процессорам в моём примере поразному его нагружают, поэтому, в идеале, при выравнивании нагрузок, можно добится результата и получше, но это уже идеализация.
Как мне намекнули на этом форуме GIL в multiprocessing не играет никакой роли.