gpt4 book ai didi

python - 与外部程序的多重处理 - 执行速度

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

我需要对我的数据运行一个相对较慢的外部程序几百万次。这个外部程序称为 RNAup,是一个用于确定两个 RNA 之间的结合能的程序。在许多情况下,每个 RNA-RNA 对需要十到十五分钟。这对于在几百万行数据上顺序运行来说太慢了,因此我决定通过尽可能并行运行程序来加速该过程。然而,它仍然太慢了。下面是我如何并行化它的使用:

import subprocess
import multiprocessing as mult
import uuid

def energy(seq, name):
for item in seq:
item.append([]) # adding new list to house the energy information

stdin = open("stdin" + name + ".in", "w")
stdin.write(item)
stdin.close()
stdin = open("stdin" + name + ".in", "r") # bug: this line is required to prevent bizarre results. maybe to slow down something? time.sleep()ing is no good, you must access this specific file for some reason!
stdout = open("stdout" + name + "out", "w")

subprocess.call("RNAup < stdin" + name + ".in > stdout" + name + ".out", shell=True) # RNAup call slightly modified for brevity and clarity of understanding
stdout.close()

stdout = open("stdout" + name + ".out", "r")
for line in stdout:
item[-1].append(line)
stdout.close()
return seq

def intermediate(seq):
name = str(uuid.uuid4()) # give each item in the array a different ID on disk so as to not have to bother with mutexes or any kind of name collisions
energy(seq, name)

PROCESS_COUNT = mult.cpu_count() * 20 # 4 CPUs, so 80 processes running at any given time
mult.Pool(processes=PROCESS_COUNT).map(intermediate, list_nucleotide_seqs)

如何显着提高程序的速度? (顺便说一句,我会接受涉及将部分、大部分或全部程序转移到C的答案。)现在,需要半年的时间才能完成我所有的数据,这是根本无法接受的,我需要一些使我的程序更快的方法。

最佳答案

如果 RNAup 确实要花费 10-15 分钟来处理输入文件中的每一行,那么您在这里无能为力。 才是瓶颈,而不是 Python 代码。将 RNAup 的工作分散到所有可用的内核上是您可以在一台机器上加速的最佳方法,这最多意味着您的速度会提高 4 倍(假设有 4 个 CPU 内核)。但如果您有 100 万对,您仍然需要 10 分钟 x 250,000 组运行。假设您无法使 RNAup 更快,听起来您需要使用 Celery 在多台机器上分发这项工作。 ,或其他一些分布式框架。

关于python - 与外部程序的多重处理 - 执行速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597394/

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