为什么muttithreading quicksort比python中的普通quicksort慢?

时间:2017-01-27 12:19:12

标签: python multithreading python-3.x quicksort python-multithreading

使用mutlithreading实现的快速排序的性能低于正常的快速排序,尽管我的处理器是双核的。

请提供改善多线程性能的建议。

我上传了两个版本的quicksort,并且还使用python3(3.5.2)编写了测试用例生成器

Multithread Quicksort

#quicksort in multithreading

from queue import Queue 
import threading
import time

n = int(input().strip())
arr = [int(arr_temp) for arr_temp in input().strip().split(' ')]
f = open('results.txt','w')

q = Queue()
q.put([0,n-1])

def aux(i,j):
    if i<j:
        pivot = j
        k = 0
        global arr 
        while k<pivot:
            if arr[k]>arr[pivot]:
                tmp = arr[k]
                itr = k+1
                while itr<=pivot:
                    arr[itr-1]=arr[itr]
                    itr+=1
                arr[pivot]=tmp

                k-=1
                pivot-=1
            else:
                pass
            k+=1
        q.put([i, pivot-1])
        q.put([pivot+1, j])
    else:
        pass



def qsort_threader():
    while  True:
        if q.empty():
            pass
        else:
            indices = q.get()
            aux(indices[0],indices[1])
            q.task_done()


start = time.time()

for i in range (0,15):
    t = threading.Thread(target = lambda: qsort_threader())
    t.daemon = True
    t.start()

q.join()
print(time.time()-start)
f.write(str(arr))

这也是普通版

Normal Quicksort

#normal quicksort

import threading
import time

n = int(input().strip())
arr = [int(arr_temp) for arr_temp in input().strip().split(' ')]
f = open('results.txt','w')

def xsort(i=0,j=n-1):
    #print(threading.currentThread().getName())
    if i<j:
        pivot = j
        k = 0
        global arr 
        while k<pivot:
            if arr[k]>arr[pivot]:
                tmp = arr[k]
                itr = k+1
                while itr<=pivot:
                    arr[itr-1]=arr[itr]
                    itr+=1
                arr[pivot]=tmp

                k-=1
                pivot-=1
            else:
                pass
            k+=1

        xsort(i,pivot-1)
        xsort(pivot+1,j)
    else:
        pass



start = time.time()
xsort()
print(time.time()-start)
f.write(str(arr))
f.close()

以下是测试代码生成器

测试用例生成器

f = open('testfile.txt','w')
n = int(input("no of integers to generate ? "))
f.write(str(n)+'\n')
from random import randint as r
for i in range(0,n):
    f.write(str(r(-100000,100000))+' ')
f.close()

我还在10000个未分类随机数的测试用例上运行程序时上传CPU性能图的截图

正常快速排序期间的CPU图表

see the 100% usage of CPU-3

多线程快速排序期间的CPU图

No CPU is utilized properly

Normal Quicksort在20.041423797607422秒内完成任务。 多线程Quicksort在27.749499320983887秒完成它。

2 个答案:

答案 0 :(得分:1)

你会看到着名的GIL正在运行:“mutex阻止多个本机线程一次执行Python字节码”。

Guido建议将multiprocessing用于IPC消息传递,而不是使用共享状态的线程。

如果对稳定性没有特殊要求,可以尝试PyPy-STM,这是删除GIL的最完整尝试。

答案 1 :(得分:0)

Python使用全局解释器锁,这意味着任何时候只能运行一个线程。因此,您无法在Python中充分利用具有线程的多核机器。它运行速度较慢的原因可能是多线程示例中增加的通信开销。

我建议用C或其他语言编写多线程解决方案,允许真正的多线程并从Python程序中分离它。