利用concurrent.futures加速Python数据处理:3行代码提升4倍效率

需积分: 0 1 下载量 113 浏览量 更新于2024-08-05 收藏 578KB PDF 举报
在本文中,作者Adam Geitgey探讨了如何利用Python进行数据处理时提升性能,特别关注的是如何通过并行计算来加速常规脚本。Python虽然以其易学性和灵活性著称,但其单线程执行可能会限制在多核处理器上的性能。文章提到,当处理大量数据时,如处理图像文件夹中的JPEG图像,通过创建缩略图,单个进程可能导致电脑资源浪费。 传统的Python处理方法是使用单个进程,例如通过`glob`获取文件夹中的JPEG图像,然后逐个使用`PIL`库处理这些图像。然而,这种方法的瓶颈在于CPU的利用率不足。作者提出了一种利用`concurrent.futures`模块实现并行化的技巧,只需要3行代码即可显著提升效率。 首先,导入所需的库,包括`glob`, `os`, 和 `PIL`。接下来,定义一个名为`make_image_thumbnail`的函数,它接收一个图像文件名,打开图片,缩放至128x128像素,并保存为缩略图。在传统实现中,这段代码会顺序执行,对于大量图像来说可能耗时。 并行处理的实现则是利用`concurrent.futures`模块的`ThreadPoolExecutor`或`ProcessPoolExecutor`。在新版本的代码中,可以创建一个线程池或进程池,将处理图像的任务分发到多个CPU核心上。通过将`make_image_thumbnail`函数包装在一个`ThreadPoolExecutor`或`ProcessPoolExecutor`的`submit`方法中,任务会被自动并行化。这样,电脑的多个CPU核心可以同时处理不同的图像,从而达到4倍于单线程的处理速度。 例如,使用`ThreadPoolExecutor`的代码可能如下所示: ```python from concurrent.futures import ThreadPoolExecutor def parallel_process_images(image_files): with ThreadPoolExecutor(max_workers=4) as executor: thumbnail_filenames = list(executor.map(make_image_thumbnail, image_files)) return thumbnail_filenames image_files = glob.glob("*.jpg") thumbnails = parallel_process_images(image_files) ``` 在这个并行版本中,`max_workers`参数设为4,表示使用4个线程同时处理。`executor.map`会将`image_files`中的每个文件名作为单独任务提交,每个线程独立处理一块数据,最终返回所有缩略图的文件名列表。 通过这种方式,作者展示了如何利用Python的并行计算能力,通过简单的代码调整,极大地提高了数据处理脚本的执行效率。这对于那些需要处理大量数据的场景,如图像处理、数据分析等领域,具有实际的应用价值。