gpt4 book ai didi

python - python hdf5解析函数多线程时速度没有提升

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:31 25 4
gpt4 key购买 nike

我有一个函数:

1) 读入一个 hdf5 数据集作为整数 ascii 码

2) 将 ascii 整数转换为字符...chr() 函数

3) 将字符连接成一个字符串函数

经过分析,我发现绝大多数计算都花在了步骤 #2,即 ascii 整数到字符的转换上。我使用以下方法对这个调用进行了一些优化:

''.join([chr(x) for x in file[dataSetName].value])

由于我的解析函数似乎是 cpu 绑定(bind)(整数到字符的转换)而不是 i/o 绑定(bind),我希望通过专门用于解析的内核数量获得或多或少的线性速度增强。连续解析一个文件需要大约 15 秒……解析 10 个文件(在我的 12 核机器上)需要大约 150 秒,同时使用 10 个线程。也就是说,似乎根本没有增强。

我使用了以下代码来启动我的线程:

    threads=[]
timer=[]
threadNumber=10
for i,d in enumerate(sortedDirSet):
timer.append(time.time())
# self.loadFile(d,i)
threads.append(Thread(target=self.loadFileargs=(d,i)))
threads[-1].start()
if(i%threadNumber==0):
for i2,t in enumerate(threads):
t.join()
print(time.time()-timer[i2])
timer=[]
threads=[]

for t in threads:
t.join()

如有任何帮助,我们将不胜感激。

最佳答案

Python 不能使用多核(由于 GIL),除非你生成子进程(例如使用 multiprocessing)。因此,您不会通过为 CPU 绑定(bind)任务生成线程来获得任何性能提升。


这是一个使用multiprocessingqueue 的脚本示例:

from Queue import Empty # <-- only needed to catch Exception
from multiprocessing import Process, Queue, cpu_count

def loadFile(d, i, queue):
# some other stuff
queue.put(result)

if name == "main":
queue = Queue()
no = cpu_count()
processes = []

for i,d in enumerate(sortedDirSet):
p = Process(target=self.loadFile, args=(d, i, queue))
p.start()
processes.append(p)

if i % no == 0:
for p in processes:
p.join()
processes = []

for p in processes:
p.join()

results = []
while True:
try:
# False means "don't wait when Empty, throw an exception instead"
data = queue.get(False)
results.append(data)
except Empty:
break

# You have all the data, do something with it

另一种(更复杂的)方法是使用 pipe 而不是 queue

生成进程,然后创建作业队列并将它们(通过 pipe)发送到子进程(这样您就不必每次都创建一个进程)也会更有效。但这会更加复杂,所以我们就这样吧。

关于python - python hdf5解析函数多线程时速度没有提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16302443/

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