[英]Python saving execution time when multithreading
我在python 2.7中使用多线程和使用队列时遇到问题。 我希望带有线程的代码花费的时间大约是没有线程的代码的一半,但是我认为我做错了。 我正在为斐波那契序列使用一种简单的循环技术,以最好地显示问题。
这是没有线程和队列的代码。 它打印了19.9190001488秒作为其执行时间。
import time
start_time = time.time()
def fibonacci(priority, num):
if num == 1 or num == 2:
return 1
a = 1
b = 1
for i in range(num-2):
c = a + b
b = a
a = c
return c
print fibonacci(0, 200000)
print fibonacci(1, 100)
print fibonacci(2, 200000)
print fibonacci(3, 2)
print("%s seconds" % (time.time() - start_time))
这是带有线程和队列的代码。 它打印了21.7269999981秒作为其执行时间。
import time
start_time = time.time()
from Queue import *
from threading import *
numbers = [200000,100,200000,2]
q = PriorityQueue()
threads = []
def fibonacci(priority, num):
if num == 1 or num == 2:
q.put((priority, 1))
return
a = 1
b = 1
for i in range(num-2):
c = a + b
b = a
a = c
q.put((priority, c))
return
for i in range(4):
priority = i
num = numbers[i]
t = Thread(target = fibonacci, args = (priority, num))
threads.append(t)
#print threads
for t in threads:
t.start()
for t in threads:
t.join()
while not q.empty():
ans = q.get()
q.task_done()
print ans[1]
print("%s seconds" % (time.time() - start_time))
我认为会发生的事情是,多线程代码花费的时间是不带线程的代码的一半。 本质上,我认为所有线程都可以同时工作,因此计算出200,000的斐波那契数的2个线程将同时完成,因此执行速度大约是没有线程的代码的两倍。 显然这不是发生了什么。 难道我做错了什么? 我只想同时执行所有线程,按它们启动的顺序打印,而耗时最长的线程几乎是执行时间。
编辑:
我更新了代码以使用流程,但是现在不打印结果了。 仅显示0.163000106812秒的执行时间。 这是新代码:
import time
start_time = time.time()
from Queue import *
from multiprocessing import *
numbers = [200000,100,200000,2]
q = PriorityQueue()
processes = []
def fibonacci(priority, num):
if num == 1 or num == 2:
q.put((priority, 1))
return
a = 1
b = 1
for i in range(num-2):
c = a + b
b = a
a = c
q.put((priority, c))
return
for i in range(4):
priority = i
num = numbers[i]
p = Process(target = fibonacci, args = (priority, num))
processes.append(p)
#print processes
for p in processes:
p.start()
for p in processes:
p.join()
while not q.empty():
ans = q.get()
q.task_done()
print ans[1]
print("%s seconds" % (time.time() - start_time))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.