python - 如何使重复图像查找过程比 joblib 更快?
问题描述
我有近 300 张非常大的图像。并找出哪个图像是重复的。因此,打开所有图像并使它们变小图像(64,64),并转换为 numpy 数组。最后比较所有 numpy 数组,如果一对数组的 sum() 为零,则该对是重复的。
这很简单。但问题是速度。
所以我正在尝试使用 joblib 作为并行化包。
但是,它非常慢。
我想,腌制的数据太大了,所以开销会变慢。
我怎样才能使这个代码效率并行?以下是所有代码。
import pandas as pd
from PIL import Image
import os
import numpy as np
from tqdm import tqdm
import joblib
from joblib import Parallel, delayed
from itertools import combinations
导入包
data = pd.DataFrame(os.listdir("git"), columns=["dir"])
data["dir"] = "git/"+data["dir"]
tqdm.pandas()
data["image"] = data["dir"].progress_apply(Image.open)
加载数据
data["small_image"] = data["image"].progress_apply(lambda x: x.resize((64,64)))
为速度制作更小的图像
data["small_image"] = data["small_image"].progress_apply(np.array)
将图像转换为 np 数组。
def test(i, j):
tmp = data["small_image"][i]-data["small_image"][j]
if tmp.sum() == 0:
print("DUPLICATE!")
return (i, j)
else:
return 0
这是判断哪个图像对重复的功能。
最后,
set(Parallel(n_jobs=1)(delayed(test)(i,j) for i, j in combinations(range(4), 2)))
# Wall time: 2.93 ms
set(Parallel(n_jobs=2)(delayed(test)(i,j) for i, j in combinations(range(4), 2))) # 2,3, -1, -2 almost same time
# Wall time: 49.2 s
解决方案
推荐阅读
- javascript - 如何在没有html的情况下将选择成本计算器更改为复选框
- excel - 在特定单元格上按下回车键时如何运行宏
- c++ - linux上的原子存储编译问题
- javascript - React:获取文档的最快方式
- android - 如何在 Expo 弹出的启动画面中使用 SVG 图像
- xamarin - Xamarin Forms,用于放置文件访问代码的项目
- php - 在 laravel 5 的表格中显示寄存器数量
- jquery - Jquery Datatables不显示数据
- javascript - 如何重置函数范围之外的数组
- r - 如何修复 cor() 函数中的“尺寸不兼容”错误