使用mutlithreading实现的快速排序的性能低于正常的快速排序,尽管我的处理器是双核的。
请提供改善多线程性能的建议。
我上传了两个版本的quicksort,并且还使用python3(3.5.2)编写了测试用例生成器
#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
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性能图的截图
Normal Quicksort在20.041423797607422秒内完成任务。 多线程Quicksort在27.749499320983887秒完成它。
答案 0 :(得分:1)
你会看到着名的GIL正在运行:“mutex阻止多个本机线程一次执行Python字节码”。
Guido建议将multiprocessing用于IPC消息传递,而不是使用共享状态的线程。
如果对稳定性没有特殊要求,可以尝试PyPy-STM,这是删除GIL的最完整尝试。
答案 1 :(得分:0)
Python使用全局解释器锁,这意味着任何时候只能运行一个线程。因此,您无法在Python中充分利用具有线程的多核机器。它运行速度较慢的原因可能是多线程示例中增加的通信开销。
我建议用C或其他语言编写多线程解决方案,允许真正的多线程并从Python程序中分离它。