gpt4 book ai didi

Python-多处理

转载 作者:行者123 更新时间:2023-12-01 07:07:32 24 4
gpt4 key购买 nike

我想完成以下任务:

我有一个“输入”tsv 文件:

0   2   0
2 5 1
5 10 2
10 14 5

我想将其转换为以下格式:

0
0
1
1
1
2
2
2
2
2
5
5
5
5

我设法使用以下代码来做到这一点:(开始是输入文件的第一列,停止是第二列,深度是第三列。)

def parse(i):
out = []
start = int(i[0])
stop = int(i[1])
depth = i[2]
times = stop - start
out += times * [depth]
return(out)

signal = []
for i in tqdm(file):
x = parse(i)
signal.append(x)

with open('output.txt', 'w') as f:
for item in signal[0]:
f.write("%s\n" % item)

虽然我的输入文件有 16720973 行,并且我有很多这样的文件,所以我尝试使用以下代码进行并行进程以最小化执行时间:

def parse(start, stop, depth):
out = []
times = int(stop) - int(start)
out += times * [depth]
return(out)

signal = []
poolv = multip.Pool(20)
x = [poolv.apply(parse, args=(i[0], i[1], i[2])) for i in tqdm(file)]
signal.append(x)
poolv.close()

但执行时间没有差异,我认为没有发生多进程。是否有任何错误或更好的方法来解决这个问题以最小化执行时间?

最佳答案

docs对于 apply(func[, args[, kwds]]) 函数来说

It blocks until the result is ready. Given this blocks, apply_async() is better suited for performing work in parallel. Additionally, func is only executed in one of the workers of the pool.

这意味着您会依次阻塞池处理输入文件的行,直到池工作人员之一生成结果为止。第二件事是,我认为尝试在池工作人员之间拆分输入文件的不同行的处理不会获得明显的加速。我会告诉你更多,我认为你会花更多时间在进程之间来回传输数据,而不是实际节省处理本身的时间,从而减慢整个过程,因为在你的情况下,它不是长时间运行的工作。

也许值得尝试并行处理多个输入文件,但考虑到它们通常存储在同一个 HDD 上的事实,它也 won't give you any speed up .

顺便说一句如果您觉得这很有用,以下是如何在一行中使用 bashawk 进行处理:

while read line; do echo $line | awk '{for(i = 0; i < $2 - $1; i++) print $3}'; done < input.txt > output.txt

这是您的input.txt:

0   2   0
2 5 1
5 10 2
10 14 5

这就是您在 output.txt 文件中得到的内容:

0
0
1
1
1
2
2
2
2
2
5
5
5
5

使用这种方法,您可以在终端中启动一堆作业,看看它是否会加快多个文件的处理速度。

关于Python-多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58374338/

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