Multiprocessing using maximum CPU power in Python-3.x
我正在研究由3.2亿个字符组成的人类基因组,我有一个需要在这些数据中搜索的对象列表。 像这样的东西:
1 2 3 4 5 6 7 8 9 10 | 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)
您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | 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 |
如果有人可以检查并验证更好的代码。 (抱歉我的英文顺便说一句)