Python-为什么多线程不能提高我的代码速度?

时间:2019-09-04 18:59:32

标签: python multithreading performance operating-system

我尝试通过在不使用两个线程的情况下运行此代码来改进代码:

from threading import Lock
from threading import Thread
import time

start_time = time.clock()

arr_lock = Lock()

arr = range(5000)

def do_print():
    # Disable arr access to other threads; they will have to wait if they need to read
    a = 0
    while True:
        arr_lock.acquire()
        if len(arr) > 0:
            item = arr.pop(0)
            print item
            arr_lock.release()
            b = 0
            for a in range(30000):
                b = b + 1
        else:
            arr_lock.release()
            break
thread1 = Thread(target=do_print)
thread1.start()
thread1.join()

print time.clock() - start_time, "seconds"

运行2个线程时,我的代码的运行时间增加了。有谁知道为什么会这样,还是知道提高我的代码性能的另一种方式?

1 个答案:

答案 0 :(得分:1)

您看不到多线程的任何性能提高的主要原因是因为您的程序一次只允许一个线程执行任何有用的事情。另一个线程始终被阻止。

两件事:

删除在锁内调用的打印语句。打印语句严重影响性能和时间。另外,stdout的I / O通道本质上是单线程的,因此您已在代码中构建了另一个隐式锁。因此,让我们删除打印语句。

使用适当的睡眠技术代替“自旋锁定”,并从0计数到30000。这只会不必要地消耗内核。

尝试将此作为您的主循环

while True:
    arr_lock.acquire()
    if len(arr) > 0:
        item = arr.pop(0)
        arr_lock.release()
        time.sleep(0)
    else:
        arr_lock.release()
        break

这应该会更好一些...我什至会提倡完全取消睡眠声明,这样您就可以让每个线程都拥有一个完整的范围。

但是,由于每个线程在锁中时要么不执行任何操作(休眠或在获取时被阻塞),要么仅在阵列上执行一次弹出调用,所以大部分时间将花费在获取/释放调用,而不是实际在阵列上进行操作。因此,多个线程不会使您的程序运行更快。