我正在研究由3.2亿个字符组成的人类基因组,我有一个需要在这些数据中搜索的对象列表。像这样:
result_final=[]
objects=['obj1','obj2','obj3',...]
def function(obj):
result_1=search_in_genome(obj)
return(result_1)
for item in objects:
result_2=function(item)
result_final.append(result_2)
每个对象在数据中的搜索花费将近30秒,并且我有数千个对象。我注意到,在连续执行此操作时,只使用了7%的CPU和5%的RAM。当我搜索时,为了减少计算时间,我应该使用排队,线程或多处理进行并行计算。但对于非专家来说,它们似乎很复杂。任何人都可以帮助我如何编写python代码来运行10个同时搜索,是否可以让python使用最大可用CPU和RAM进行多处理? (我在Windows 7上使用带有64Gb RAM,COREI7和3.5 GH CPU的Python33)
答案 0 :(得分:3)
您可以使用multiprocessing
模块:
from multiprocessing import Pool
objects=['obj1','obj2','obj3',...]
def function(obj):
result_1=search_in_genome(obj)
return(result)
if __name__ == "__main__":
pool = Pool()
result_final = pool.map(function, objects)
这将允许您在计算机上的所有可用CPU上扩展工作,因为进程不受GIL的影响。您可能不希望运行比可用CPU更多的任务。一旦你这样做,你实际上开始放慢速度,因为那时CPU必须不断地在进程之间切换,这会降低性能。
答案 1 :(得分:0)
好的,我不确定你的问题,但我会这样做(请注意,可能有一个更好的解决方案,因为我不是队列对象的专家):
如果您想多线程搜索:
class myThread (threading.Thread):
def __init__(self, obj):
threading.Thread.__init__(self)
self.result = None
self.obj = obj
#Function who is called when you start your Thread
def run(self)
#Execute your function here
self.result = search_in_genome(self.obj)
if __name__ == '__main__':
result_final=[]
objects=['obj1','obj2','obj3',...]
#List of Thread
listThread = []
#Count number of potential thread
allThread = objects.len()
allThreadDone = 0
for item in objects:
#Create one thread
thread = myThread(item)
#Launch that Thread
thread.start()
#Stock it into the list
listThread.append(thread)
while True:
for thread in listThread:
#Count number of Thread who are finished
if thread.result != None:
#If a Thread is finished, count it
allThreadDone += 1
#If all thread are finished, then stop program
if allThreadDone == allThread:
break
#Else initialyse flag to count again
else:
allThreadDone = 0
如果有人可以检查并验证更好的代码。 (抱歉我的英文顺便说一句)