付録4:性能比較方法#
この記事では、PyMuPDF の性能を測定するアプローチと、比較を行うために使用されるツールとサンプルファイルについて説明します。
以下の3つのセクションでは、異なる性能の側面に取り組んでいます:
ドキュメントのコピー - これには PDF ファイルの開閉と解析、そしてそれらを出力ファイルに書き込む作業が含まれます。同じ基本的なアクティビティは、PDF ファイルの結合(マージ)にも使用されるため、結果はこれらのユースケースにも適用されます。
テキスト抽出 - これにより PDF ファイルから平文テキストが抽出され、テキストファイルに書き込まれます。
ページレンダリング - これによりPDFページがページと同じような見た目の画像ファイルに変換されます。この機能は、Python GUI スクリプトでドキュメントをスクロールするための基本的な前提条件です。中画質版(解像度150 DPI)を選択しました。
PDF 構造の処理速度そのものを直接測定するのではなく、すべての場合において、タイミングにはファイルをオペレーティングシステムのファイルシステムに書き込む時間も含まれることに注意してください。これは回避できない要因です。なぜなら、PyMuPDF 以外のツールでは、例えばイメージの 作成 ステップと、イメージをファイルに 書き込む 後続のステップを分離するオプションが提供されていないためです。
したがって、すべての記録されたタイミングには共通のOS指向の基本的な努力が含まれています。したがって、ツールごとの性能の違いは、数字が示す以上に実際には大きいです 。
使用されるファイル#
性能テストには、8つのファイルセットが使用されます。各ファイルには、次の情報があります:
ファイル 名 とダウンロード リンク。
バイト単位の サイズ。
ファイル内の総 ページ 数。
ブックマーク( 目次 エントリー)の総数。
リンク の総数。
ページごとの 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 の両方で実行できます。
ツール |
説明 |
---|---|
PyMuPDF |
このマニュアルのツールです。 |
rst2pdf で使用される純粋な Python ツールで、ReportLabとのインターフェースを持っています。 |
|
多くの機能を備えた純粋な Python ツールです。 |
|
PDF からテキストやその他のデータを抽出するための純粋な Python ツールです。 |
|
複数の機能を備えたコマンドラインユーティリティです。 |
|
C++ ライブラリ QPDF に基づいた Python パッケージで、 PDFrw に類似しています。 |
|
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で 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 ./
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 |