[英]Easiest (least amount of boilerplate code) way to parallelize a python loop?
我有一些看起來像這樣的代碼:
for photo in photoInfo:
if not('url' in photo):
raise Exception("Missing URL: " + str(photo) + " in " + str(photoInfo))
sizes = getImageSizes(photo['url'])
photo.update(sizes)
這可能並不明顯,但代碼會為每張照片執行高延遲I / O(打開遠程URL)和適度CPU密集型進程(解析圖像和提取大小)的混合。
並行化此代碼的最簡單方法是什么?
到目前為止我嘗試過的
我在另一個更復雜的問題的答案中找到了這個代碼,但是我很難將它映射回我更簡單的用例:
from itertools import product
from multiprocessing import Pool
with Pool(processes=4) as pool: # assuming Python 3
pool.starmap(print, product(range(2), range(3), range(4)))
您可以使用Pool.map
並行化圖像大小的獲取,並使用返回值和相同的鍵構建新的dict:
from multiprocessing import Pool
def get_image_size(photo):
if 'url' not in photo:
raise Exception("Missing URL: " + str(photo))
return getImageSizes(photo['url'])
if __name__ == '__main__':
with Pool() as pool:
photoInfo = dict(zip(photoInfo, pool.map(get_image_size, photoInfo)))
from multiprocessing import Pool
import os
def user_defined_function(url):
#your logic for a single url
pass
if __name__ == '__main__':
urls_list = ['u1','u2']
pool = Pool(os.cpu_count()) # Create a multiprocessing pool
pool.map(user_defined_function, urls_list)
它的示例代碼可以根據您的使用情況進行修改。 我將列表的每個元素映射到您的函數並單獨執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.