如何并行化Python的嵌套for循环?

如何并行化Python的嵌套for循环?,python,for-loop,parallel-processing,Python,For Loop,Parallel Processing,这是我最后一年项目的循环代码。它工作正常,但执行速度较慢。我需要加快速度。这是一个嵌套的for循环,所以有没有一种方法来并行化这段代码 for user in users.each(): count += 1 if not os.path.isdir("Facial_images/face_rec/train/User_" + str(count)): os.makedirs(&q

这是我最后一年项目的循环代码。它工作正常,但执行速度较慢。我需要加快速度。这是一个嵌套的for循环,所以有没有一种方法来并行化这段代码

        for user in users.each():
            count += 1
            if not os.path.isdir("Facial_images/face_rec/train/User_" + str(count)):
                os.makedirs("Facial_images/face_rec/train/User_" + str(count))
            for i in range(20):
                DBHelper.download_user_photo("User_" + str(count) + "/" + str(i) + ".jpg")


您可以使用三种主要方法。多处理、多线程和协同程序。每种方法都有多种方法,在协同路由的情况下,技术有多种名称

多线程您将为每次下载创建一个新进程,多线程您将创建一个新线程。线程的重量比进程轻(但不多),并且共享内存。因此,操作系统在线程之间切换的成本更低,并且您可以在每个线程中访问相同的数据,而无需复制数据或发送消息。线程的缺点是,您需要控制对共享内存的访问以防止争用情况,在Python的情况下,线程将永远不会实际并行运行,因为它们共享一个具有全局解释器锁(GIL)的解释器,以防止解释器本身发生此类情况

对于多处理,这不是一个问题,因为每个进程都有自己的解释器和GIL。每个进程也有自己的内存空间,因此您必须明确地设置您想要的任何共享内存(尽管这并不真正适用于您的问题)。由于每个进程都有自己的内存和解释器,因此在进程之间切换比在线程之间切换需要更长的时间

协程有点像是在单个线程中存在的重量更轻的线程。基本上,在等待输入/输出(IO)之前,您会尽可能多地完成工作,然后以某种方式(自动)保存该例程的状态,并继续进行其他可以完成的工作。每当一个协同程序用完有用的工作或开始等待IO时,您的程序都会返回并根据已完成的IO操作检查挂起的协同程序现在能够完成哪些工作(理论上,可能还会有其他情况发生此检查,这将特定于协同程序的实现)这样,切换上下文(即线程或进程之间)的成本最低,并且使用的内存最少。在本例中,您的程序实际上从未并行执行任何操作,但操作系统正在代表您执行并行IO操作

多处理库将为您提供多处理,线程将为您提供多线程(如果您选择其中一种,我建议使用池或线程池),asyncio将为您提供协同程序支持。看


当然,即使您使这些操作并行,它们也可能不会更快,这取决于文件从何处下载以及服务器将为您的下载分配多少带宽,即如果一次下载获得100kbps,两次下载只会获得50kbps吗?它仍然会快一点,很可能是因为您将并行执行TCP握手。

您需要的是多线程。请参阅。查看代码片段,它将被IO绑定,等待照片下载。多处理可以工作,但需要比多线程更多的资源,而且可能会稍微快一点,事实上,根据下载用户照片所做的事情,速度可能会慢一些(如果下载被写入磁盘,如果它们进入内存,速度会快一些,进程必须将结果传回主进程。)异步IO可能是最有效的方法。看见