美好的一天!多線程工作較慢
我想學多線程在python的功能和我寫了下面的代碼:有4個CPU
import time, argparse, threading, sys, subprocess, os
def item_fun(items, indices, lock):
for index in indices:
items[index] = items[index]*items[index]*items[index]
def map(items, cores):
count = len(items)
cpi = count/cores
threads = []
lock = threading.Lock()
for core in range(cores):
thread = threading.Thread(target=item_fun, args=(items, range(core*cpi, core*cpi + cpi), lock))
threads.append(thread)
thread.start()
item_fun(items, range((core+1)*cpi, count), lock)
for thread in threads:
thread.join()
parser = argparse.ArgumentParser(description='cube', usage='%(prog)s [options] -n')
parser.add_argument('-n', action='store', help='number', dest='n', default='1000000', metavar = '')
parser.add_argument('-mp', action='store_true', help='multi thread', dest='mp', default='True')
args = parser.parse_args()
items = range(NUMBER_OF_ITEMS)
# print 'items before:'
# print items
mp = args.mp
if mp is True:
NUMBER_OF_PROCESSORS = int(os.getenv("NUMBER_OF_PROCESSORS"))
NUMBER_OF_ITEMS = int(args.n)
start = time.time()
map(items, NUMBER_OF_PROCESSORS)
end = time.time()
else:
NUMBER_OF_ITEMS = int(args.n)
start = time.time()
item_fun(items, range(NUMBER_OF_ITEMS), None)
end = time.time()
#print 'items after:'
#print items
print 'time elapsed: ', (end - start)
當我使用MP的說法,它的工作原理比較慢,我的機器上,它需要大約0.5秒來計算結果,而如果我使用單線程,則需要大約0.3秒。
我做錯了什麼?
我知道有Pool.map()和e.t.c,但它產生的子進程不線程,它的工作原理更快據我知道,但我想我自己寫的線程池。
這個答案稍微不明確,線程也可以提高CPU綁定工作負載的性能,如果它不是GIL。事實上,這就是人們來自其他線程環境的人們所期望的線程。當然,還有其他一些方法可以增強Python中CPU綁定負載的處理。總的來說,答案爲+1。 –