附录 4:性能比较方法#
本文记录了测量PyMuPDF性能的方法以及用于比较的工具和示例文件。
以下三个部分处理不同的性能方面:
文档复制 - 这包括打开和解析 PDFs,然后将它们写入输出文件。由于相同的基本活动也用于合并 PDFs,因此结果同样适用于这些用例。
文本提取 - 这从 PDF 中提取纯文本并将其写入输出文本文件。
页面渲染 - 这将 PDF 页转换为外观与页面相同的图像文件。这种能力是使用工具在 Python GUI 脚本中浏览文档的基本先决条件。我们选择了一种中等质量(分辨率 150 DPI)的版本。
请注意,在所有情况下,处理PDF结构的实际速度并不是直接测量的:相反,时间还包括将文件写入操作系统文件系统的持续时间。无法避免这一点,因为除了PyMuPDF之外,其他工具没有提供例如将图像创建步骤与接下来的步骤分开的选项,而后者是写入图像到文件中。
所以所有记录的时间包括一个共同的、面向操作系统的基础工作。因此,性能每种工具的差异实际上更大,而不仅仅是数字所暗示的。
使用的文件#
一个包含八个文件的集合用于性能测试。对于每个文件,我们拥有以下信息:
文件的名称和下载 链接。
大小 以字节为单位。
文件中页数总数。
书签的总数 (目录 项目).
链接的总数.
每页的KB大小.
每页文本大小是整个文件中文本的总量(以KB为单位),除以页面数。
任何 备注 用于一般描述文件类型。
名称 |
大小 (字节) |
页数 |
目录大小 |
链接 |
KB/页 |
文本大小/页 |
备注 |
|---|---|---|---|---|---|---|---|
32,472,771 |
1,310 |
794 |
32,096 |
24 |
1,942 |
线性化,许多链接 / 书签 |
|
31,570,732 |
47 |
46 |
2,035 |
656 |
3,538 |
图形导向 |
|
29,326,355 |
1,241 |
0 |
0 |
23 |
2,142 |
||
8,222,384 |
214 |
31 |
242 |
38 |
1,058 |
文本和图形的混合 |
|
10,585,962 |
3,071 |
536 |
16,554 |
3 |
1,539 |
许多页面 |
|
6,805,176 |
478 |
276 |
5,277 |
14 |
1,937 |
文本导向 |
|
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上运行。
复制 / 连接 / 合并#
一个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 |
数据库系统.pdf |
0.15 |
0.8 |
1.68 |
2.46 |
字体锻造.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 |
示例-50-兆字节-pdf-文件.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 |
数据库系统.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 |
示例-50-MB-pdf-文件.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的分辨率下测试了PyMuPDF与pdf2jpg和XPDF的渲染速度,
这些是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("t-%s.png" % p.number)
pix = None
doc.close()
return
XPDF
pdftopng.exe -r 150 file.pdf ./
PDF转JPG
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 |
数据库系统.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 |
示例-50-兆字节-pdf-文件.pdf |
1.01 |
1.32 |
5.22 |
总计 |
367.04 |
646 |
851.52 |
与 PyMuPDF 的比较速率 |
1.0 |
1.76 |
2.32 |