附录 4:性能比较方法#
本文档介绍了衡量 PyMuPDF 性能的方法以及用于进行比较的工具和示例文件。
以下三节介绍不同的性能方面
文档复制 - 这包括打开和解析 PDF 文件,然后将它们写入输出文件。由于相同的基本活动也用于合并 PDF 文件,因此结果也适用于这些用例。
文本提取 - 这从 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 |
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 |
页面渲染#
我们测试了 PyMuPDF 与 pdf2jpg 和 XPDF 在 150 DPI 分辨率下的渲染速度,
以下是每种工具使用的 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 ./
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 |