Python中Pytesseract与EasyOCR的速度对比及优化疑问
PDF转文本OCR速度慢的原因分析与优化方案
针对你在M1 Pro上用pdf2image搭配pytesseract/EasyOCR遇到的速度问题,下面从原因到优化方案逐一说明:
一、核心原因拆解
1. pytesseract的性能瓶颈
- 图片转换冗余:
pdf2image默认生成200dpi的高分辨率图片,大幅增加Tesseract的处理负担 - 串行单页处理:代码循环逐个处理页面,完全没利用M1 Pro的多核心优势
- 默认配置未优化:Tesseract默认没开启多线程,也没启用快速识别模式
2. EasyOCR的性能瓶颈
- 未利用M1 GPU:EasyOCR基于深度学习模型,默认用CPU推理,M1的GPU加速完全没发挥
- 图片无预处理:直接传入原图,高分辨率图片会让模型计算量暴增
- 单页串行推理:没有批量处理或并行优化,单页推理自然慢
3. M1 Pro适配问题
- pytesseract:Homebrew安装的Tesseract虽为ARM原生,但默认未开启多线程
- EasyOCR:PyTorch的Metal加速需手动配置,否则只能靠CPU跑深度学习模型
二、针对性优化方案
针对pytesseract的优化
降低图片转换开销
调低pdf2image的dpi参数、改用JPG格式减少体积:pages = convert_from_path(pdf_path, dpi=150, fmt='jpeg')启用Tesseract多线程
通过配置参数开启多线程和快速识别模式:# 配置多线程(设为M1 Pro核心数,比如8)+ 快速识别模式 custom_config = r'--oem 3 --psm 6 -c num_threads=8' f.write(pytesseract.image_to_string(pages[i], config=custom_config))并行处理多页
用concurrent.futures利用多核并行处理:from concurrent.futures import ThreadPoolExecutor def process_page(page): custom_config = r'--oem 3 --psm 6 -c num_threads=8' return pytesseract.image_to_string(page, config=custom_config) with ThreadPoolExecutor(max_workers=8) as executor: results = list(executor.map(process_page, pages)) with open('pytesseract_optimized.txt', 'w') as f: f.write(''.join(results))
针对EasyOCR的优化
开启M1 GPU加速
配置PyTorch使用Metal后端,让模型跑在GPU上:import torch # 自动检测MPS(Metal)设备 device = 'mps' if torch.backends.mps.is_available() else 'cpu' reader = easyocr.Reader(['en'], device=device)图片预处理减载
缩小图片尺寸、转灰度,降低模型计算量:from PIL import Image def preprocess_image(page): # 转灰度减少通道数 img = page.convert('L') # 长边缩到1000px,保持比例 max_dim = 1000 w, h = img.size if max(w, h) > max_dim: scale = max_dim / max(w, h) img = img.resize((int(w*scale), int(h*scale)), Image.Resampling.LANCZOS) return numpy.array(img) processed_img = preprocess_image(pages[i]) result = reader.readtext(processed_img, detail=0)批量推理优化
用readtext_batched批量处理页面,比单页推理效率高很多:processed_pages = [preprocess_image(page) for page in pages] results = reader.readtext_batched(processed_pages, detail=0)
通用优化建议
- 优先提取原生文本:如果PDF是可编辑的(非扫描件),直接用
PyPDF2或pdfplumber提取文本,完全不需要OCR,速度快几十倍 - 缓存中间结果:重复处理同一PDF时,把转好的图片缓存到本地,避免重复转换
- 精简语言包:只加载需要的语言(比如仅'en'),不要冗余加载多语言包
三、优化后效果参考
- pytesseract:每页耗时可降到0.5-1秒(取决于图片分辨率和核心数)
- EasyOCR:启用Metal后每页耗时可降到5-8秒左右
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

