부록 4: 성능 비교 방법론¶
이 문서는 PyMuPDF’s 성능을 측정하는 접근 방식과 비교에 사용된 도구 및 예제 파일을 설명합니다.
다음 세 섹션은 다양한 성능 측면을 다룹니다:
Document Copying - 이것은 PDFs 를 열고 파싱한 다음 출력 파일에 쓰는 것을 포함합니다. 동일한 기본 활동이 PDFs 를 결합(병합)하는 데도 사용되므로, 결과는 이러한 사용 사례에도 적용됩니다.
Text Extraction - 이것은 PDFs 에서 일반 텍스트를 추출하고 출력 텍스트 파일에 씁니다.
Page Rendering - 이것은 PDF 페이지를 페이지와 동일하게 보이는 이미지 파일로 변환합니다. 이 기능은 Python GUI 스크립트에서 문서를 스크롤하기 위해 도구를 사용하는 기본 전제 조건입니다. 중간 품질(해상도 150 DPI) 버전을 선택했습니다.
모든 경우에 PDF 구조를 처리하는 실제 속도가 직접 측정되지 않는다는 점에 유의하세요: 대신 타이밍에는 운영 체제의 파일 시스템에 파일을 쓰는 데 걸리는 시간도 포함됩니다. PyMuPDF 이외의 도구는 예를 들어 이미지 생성 단계를 이미지를 파일에 쓰는 다음 단계와 분리하는 옵션을 제공하지 않기 때문에 이것을 피할 수 없습니다.
따라서 문서화된 모든 타이밍에는 공통 OS 지향 기본 작업이 포함됩니다. 따라서 도구별 성능 차이는 실제로 숫자가 시사하는 것보다 큽니다.
사용된 파일¶
성능 테스트에 8개의 파일 세트가 사용됩니다. 각 파일에 대해 다음 정보가 있습니다:
파일의 이름 및 다운로드 링크.
바이트 단위의 크기.
파일의 총 페이지 수.
책갈피(목차 항목)의 총 수.
링크 의 총 수.
페이지당 KB 크기.
페이지당 텍스트 크기 는 전체 파일의 텍스트 양(KB)을 페이지 수로 나눈 값입니다.
파일 유형을 일반적으로 설명하는 참고 사항.
이름 |
크기 (바이트) |
페이지 |
목차 크기 |
링크 |
KB/페이지 |
텍스트 크기/페이지 |
참고 사항 |
|---|---|---|---|---|---|---|---|
|
32,472,771 |
1,310 |
794 |
32,096 |
24 |
1,942 |
linearized, many links / bookmarks |
|
31,570,732 |
47 |
46 |
2,035 |
656 |
3,538 |
graphics oriented |
|
29,326,355 |
1,241 |
0 |
0 |
23 |
2,142 |
|
|
8,222,384 |
214 |
31 |
242 |
38 |
1,058 |
mix of text & graphics |
|
10,585,962 |
3,071 |
536 |
16,554 |
3 |
1,539 |
many pages |
|
6,805,176 |
478 |
276 |
5,277 |
14 |
1,937 |
text oriented |
|
9,983,856 |
669 |
198 |
1,953 |
15 |
1,929 |
|
|
52,521,850 |
1 |
0 |
0 |
51,291 |
23,860 |
단일 페이지, 그래픽 지향, 큰 파일 크기 |
참고
adobe.pdf 와 pymupdf.pdf 는 명확히 텍스트 지향적이며, artifex-website.pdf 와 sample-50-MB-pdf-file.pdf 는 그래픽 지향적입니다. 다른 파일들은 둘 다의 혼합입니다.
사용된 도구¶
각 섹션에서 동일한 고정된 PDF 파일 세트가 도구 세트에 의해 처리됩니다. 그러나 성능 측면별로 사용되는 도구 세트는 지원되는 도구 기능에 따라 다릅니다.
모든 도구는 플랫폼 독립적이거나 최소한 Windows 와 Unix / Linux 모두에서 실행할 수 있습니다.
도구 |
설명 |
|---|---|
PyMuPDF |
이 매뉴얼의 도구. |
rst2pdf 에서 사용되는 순수 Python 도구로, ReportLab 에 대한 인터페이스를 가집니다. |
|
큰 함수 집합을 가진 순수 Python 도구. |
|
PDF 에서 텍스트 및 기타 데이터를 추출하는 순수 Python. |
|
여러 기능을 가진 명령줄 유틸리티. |
|
PDFrw 와 유사한 Python 패키지이지만, C++ 라이브러리 QPDF 를 기반으로 합니다. |
|
PDF 페이지를 JPG 이미지로 렌더링하는 데 특화된 Python 패키지. |
복사 / 결합 / 병합¶
PDF 파일을 읽고 내용을 추가 처리하기 위해 파싱하는 속도는 얼마나 빠른가? 순수 파싱 성능은 직접 비교할 수 없습니다. 왜냐하면 배치 유틸리티는 항상 요청된 작업을 처음부터 끝까지 한 번에 완전히 실행하기 때문입니다. PDFrw 도 지연 파싱 전략을 가지며, 이는 언제든지 필요한 문서 부분만 파싱한다는 의미입니다.
이 질문에 대한 답을 찾기 위해, 각 도구로 PDF 파일을 출력 파일에 복사하는 데 걸리는 시간을 측정하고 다른 작업은 수행하지 않습니다.
각 도구를 사용하는 방법에 대한 Python 명령은 다음과 같습니다:
PyMuPDF
import pymupdf
doc = pymupdf.open("input.pdf")
doc.save("output.pdf")
PDFrw
doc = PdfReader("input.pdf")
writer = PdfWriter()
writer.trailer = doc
writer.write("output.pdf")
PikePDF
from pikepdf import Pdf
doc = Pdf.open("input.pdf")
doc.save("output.pdf")
PyPDF2
pdfmerge = PyPDF2.PdfMerger()
pdfmerge.append("input.pdf")
pdfmerge.write("output.pdf")
pdfmerge.close()
관찰 결과
다음은 초 단위의 실행 시간 결과와 PyMuPDF 와 비교한 기준 비율 요약입니다:
이름 |
PyMuPDF |
PDFrw |
PikePDF |
PyPDF2 |
|---|---|---|---|---|
adobe.pdf |
1.75 |
5.15 |
22.37 |
374.05 |
artifex-website.pdf |
0.26 |
0.38 |
1.41 |
2.81 |
db-systems.pdf |
0.15 |
0.8 |
1.68 |
2.46 |
fontforge.pdf |
0.09 |
0.14 |
0.28 |
1.1 |
pandas.pdf |
0.38 |
2.21 |
2.73 |
70.3 |
pymupdf.pdf |
0.11 |
0.56 |
0.83 |
6.05 |
pythonbook.pdf |
0.19 |
1.2 |
1.34 |
37.19 |
sample-50-MB-pdf-file.pdf |
0.12 |
0.1 |
2.93 |
0.08 |
총계 |
3.05 |
10.54 |
33.57 |
494.04 |
PyMuPDF 와 비교한 비율 |
1.0 |
3.5 |
11.0 |
162 |
텍스트 추출¶
다음 표는 일반 텍스트 추출 기간을 보여줍니다. 모든 도구는 가장 기본적인 기능으로 사용되었습니다 – 즉, 레이아웃 재배치 등이 없습니다.
관찰 결과
다음은 초 단위의 실행 시간 결과와 PyMuPDF 와 비교한 기준 비율 요약입니다:
이름 |
PyMuPDF |
XPDF |
PyPDF2 |
PDFMiner |
|---|---|---|---|---|
adobe.pdf |
2.01 |
6.19 |
22.2 |
49.15 |
artifex-website.pdf |
0.18 |
0.3 |
1.1 |
4.06 |
db-systems.pdf |
1.57 |
4.26 |
25.75 |
42.19 |
fontforge.pdf |
0.24 |
0.47 |
2.69 |
4.2 |
pandas.pdf |
2.41 |
10.54 |
25.38 |
76.56 |
pymupdf.pdf |
0.49 |
2.34 |
6.44 |
13.55 |
pythonbook.pdf |
0.84 |
2.88 |
9.28 |
24.27 |
sample-50-MB-pdf-file.pdf |
0.27 |
0.44 |
8.8 |
13.29 |
총계 |
8.01 |
27.42 |
101.64 |
227.27 |
PyMuPDF 와 비교한 비율 |
1.0 |
3.42 |
12.69 |
28.37 |
페이지 렌더링¶
150 DPI 해상도에서 pdf2jpg 및 XPDF 와 비교하여 PyMuPDF 의 렌더링 속도를 테스트했습니다,
각 도구를 사용하는 방법에 대한 Python 명령은 다음과 같습니다:
PyMuPDF
def ProcessFile(datei):
print "processing:", datei
doc=pymupdf.open(datei)
for p in pymupdf.Pages(doc):
pix = p.get_pixmap(dpi=150)
pix.save(f"t-{p.number}.png")
pix = None
doc.close()
return
XPDF
pdftopng.exe -r 150 file.pdf ./
PDF2JPG
def ProcessFile(datei):
print("processing:", datei)
pdf2jpg.convert_pdf2jpg(datei, "images", pages="ALL", dpi=150)
return
관찰 결과
다음은 초 단위의 실행 시간 결과와 PyMuPDF 와 비교한 기준 비율 요약입니다:
이름 |
PyMuPDF |
XPDF |
PDF2JPG |
|---|---|---|---|
adobe.pdf |
51.33 |
98.16 |
75.71 |
artifex-website.pdf |
26.35 |
51.28 |
54.11 |
db-systems.pdf |
84.59 |
143.16 |
405.22 |
fontforge.pdf |
12.23 |
22.18 |
20.14 |
pandas.pdf |
138.74 |
241.67 |
202.06 |
pymupdf.pdf |
22.35 |
39.11 |
33.38 |
pythonbook.pdf |
30.44 |
49.12 |
55.68 |
sample-50-MB-pdf-file.pdf |
1.01 |
1.32 |
5.22 |
총계 |
367.04 |
646 |
851.52 |
PyMuPDF 와 비교한 비율 |
1.0 |
1.76 |
2.32 |
