python multi-threading plus lent que la série?

Je suis à essayer de comprendre le multi-threading de la programmation en python. Voici la simple tâche avec qui je veux comparer en série et en parallèle des vitesses.

import threading
import Queue
import time
import math
def sinFunc(offset, n):
result = []
for i in range(n):
result.append(math.sin(offset + i * i))
return result
def timeSerial(k, n):
t1 = time.time()    
answers = []
for i in range(k):
answers.append(sinFunc(i, n))
t2 = time.time()
print "Serial time elapsed: %f" % (t2-t1)
class Worker(threading.Thread):
def __init__(self, queue, name):
self.__queue = queue
threading.Thread.__init__(self)
self.name = name
def process(self, item):
offset, n = item
self.__queue.put(sinFunc(offset, n))
self.__queue.task_done()
self.__queue.task_done()
def run(self):
while 1:
item = self.__queue.get()
if item is None:
self.__queue.task_done()
break
self.process(item)
def timeParallel(k, n, numThreads):
t1 = time.time()    
queue = Queue.Queue(0)
for i in range(k):
queue.put((i, n))
for i in range(numThreads):
queue.put(None)    
for i in range(numThreads):
Worker(queue, i).start()
queue.join()
t2 = time.time()
print "Serial time elapsed: %f" % (t2-t1)
if __name__ == '__main__':
n = 100000
k = 100
numThreads = 10
timeSerial(k, n)
timeParallel(k, n, numThreads)
#Serial time elapsed: 2.350883
#Serial time elapsed: 2.843030

Quelqu'un peut m'expliquer ce qu'il se passe? J'ai l'habitude de C++, et une version similaire de ce module voit le speed-up, nous nous attendrions.

Les Threads ne sont pas de la magie des appareils que vous ajoutez à l'application et il ira plus vite. L'esprit le coût de fabrication d'un fil est pas négligeable, par exemple, généralement de 1 MO d'Espace d'adressage Virtuel est utilisé seulement à la création.
Peut-être, mais ce n'est pas la question ici. L'OP est en cours d'exécution la tête la première dans le GIL, un problème est généralement résolu en utilisant le multiprocessing module ou à l'aide de Stackless Python au lieu de la valeur par défaut Disponible interprète.

OriginalL'auteur andyInCambridge | 2012-05-28