繁体   English   中英

多线程处理时,Python节省了执行时间

[英]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))

您已经遇到了CPython实现的基本限制因素之一,即全局解释器锁定或GIL。 有效地这可以序列化您的程序,您的线程将轮流执行。 一个线程将拥有GIL,而其他线程将等待GIL释放。

一种解决方案是使用单独的过程。 每个进程都有自己的GIL,因此可以并行执行。 可能最简单的方法是使用Python的多处理模块代替线程模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM