gpt4 book ai didi

python - 多线程运行速度较慢

转载 作者:行者123 更新时间:2023-11-28 20:07:19 26 4
gpt4 key购买 nike

美好的一天!

我正在尝试学习 python 中的多线程功能,我编写了以下代码:

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 参数时,它工作得更慢,在我有 4 个 CPU 的机器上,计算结果需要大约 0.5 秒,而如果我使用单线程,它需要大约 0.3 秒。

我做错了什么吗?

我知道有 Pool.map() 和 etc,但它生成子进程而不是线程,据我所知它工作得更快,但我想编写自己的线程池。

最佳答案

由于称为“GIL”的实现细节,Python 没有真正的多线程。实际上一次只有一个线程运行,Python 在线程之间切换。 (Python 的第三方实现,例如 Jython,可以是 actually run parallel threads。)

至于为什么你的程序在多线程版本中实际上更慢取决于,但是在为 Python 编码时,需要注意 GIL,所以人们不相信 CPU 绑定(bind)负载更多通过向程序中添加线程来高效处理。

其他需要注意的是例如multiprocessingnumpy用于解决 CPU 绑定(bind)负载,以及 PyEv (最小)和 Tornado (巨大的厨房水槽)用于解决 I/O 绑定(bind)负载。

关于python - 多线程运行速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17920484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com