在Python-3.x中使用最大CPU性能的多进程

2 投票
2 回答
3122 浏览
提问于 2025-04-18 14:05

我正在研究人类基因组,这个基因组有32亿个字符。我有一份需要在这些数据中搜索的对象列表,类似于这样:

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秒,而我有几千个对象。我注意到,当我一个一个地进行搜索时,CPU的使用率只有7%,内存的使用率也只有5%。我查了一下,发现为了减少计算时间,我应该使用并行计算,也就是通过排队、线程或多进程来实现。但这些对非专业人士来说似乎有点复杂。有没有人能帮我写一些Python代码,让我可以同时进行10个搜索?还有,能不能让Python尽可能多地使用可用的CPU和内存进行多进程处理?(我在Windows 7上使用Python 3.3,电脑有64GB内存,CORE I7处理器,主频3.5GHz)

2 个回答

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

如果有人能检查一下并验证这个代码,那就更好了。(顺便说一下,我的英语不好)

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需要不断在不同的进程之间切换,这样会影响性能。

撰写回答