From 249bd6b5becd12fe18a186a3661836fd8f49995e Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 14 Jun 2024 14:44:25 -0400 Subject: [PATCH 1/2] Add pypdf benchmark --- .../data/libreoffice-writer-password.pdf | Bin 0 -> 12783 bytes .../benchmarks/bm_pypdf/pyproject.toml | 9 ++ .../benchmarks/bm_pypdf/requirements.txt | 1 + .../benchmarks/bm_pypdf/run_benchmark.py | 89 ++++++++++++++++++ 4 files changed, 99 insertions(+) create mode 100755 pyperformance/data-files/benchmarks/bm_pypdf/data/libreoffice-writer-password.pdf create mode 100644 pyperformance/data-files/benchmarks/bm_pypdf/pyproject.toml create mode 100644 pyperformance/data-files/benchmarks/bm_pypdf/requirements.txt create mode 100644 pyperformance/data-files/benchmarks/bm_pypdf/run_benchmark.py diff --git a/pyperformance/data-files/benchmarks/bm_pypdf/data/libreoffice-writer-password.pdf b/pyperformance/data-files/benchmarks/bm_pypdf/data/libreoffice-writer-password.pdf new file mode 100755 index 0000000000000000000000000000000000000000..de3e0c1609eea268c2d5967d713cae893b51b4eb GIT binary patch literal 12783 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 PpigiH(9=sPO9TE7C+zim literal 0 HcmV?d00001 diff --git a/pyperformance/data-files/benchmarks/bm_pypdf/pyproject.toml b/pyperformance/data-files/benchmarks/bm_pypdf/pyproject.toml new file mode 100644 index 00000000..a68daee4 --- /dev/null +++ b/pyperformance/data-files/benchmarks/bm_pypdf/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "pyperformance_bm_pypdf" +requires-python = ">=3.8" +dependencies = ["pyperf"] +urls = {repository = "https://github.com/python/pyperformance"} +dynamic = ["version"] + +[tool.pyperformance] +name = "pypdf" diff --git a/pyperformance/data-files/benchmarks/bm_pypdf/requirements.txt b/pyperformance/data-files/benchmarks/bm_pypdf/requirements.txt new file mode 100644 index 00000000..b67812cb --- /dev/null +++ b/pyperformance/data-files/benchmarks/bm_pypdf/requirements.txt @@ -0,0 +1 @@ +pyyaml==4.2.0 diff --git a/pyperformance/data-files/benchmarks/bm_pypdf/run_benchmark.py b/pyperformance/data-files/benchmarks/bm_pypdf/run_benchmark.py new file mode 100644 index 00000000..d0a46319 --- /dev/null +++ b/pyperformance/data-files/benchmarks/bm_pypdf/run_benchmark.py @@ -0,0 +1,89 @@ +""" +A simple pypdf benchmark. + +Adapted from pypdf's own benchmarks: + + https://github.com/py-pdf/pypdf/blob/main/tests/bench.py +""" + +import io +from pathlib import Path + + +from pypdf import PdfReader, PdfWriter, Transformation +import pyperf + + +DATA_DIR = Path(__file__).parent / "data" + + +def page_ops(stream, password): + reader = PdfReader(stream) + writer = PdfWriter() + + if password: + reader.decrypt(password) + + page = reader.pages[0] + writer.add_page(page) + + op = Transformation().rotate(90).scale(1.2) + page.add_transformation(op) + page.merge_page(page) + + op = Transformation().scale(1).translate(tx=1, ty=1) + page.add_transformation(op) + page.merge_page(page) + + op = Transformation().rotate(90).scale(1).translate(tx=1, ty=1) + page.add_transformation(op) + page.merge_page(page) + + page.add_transformation((1, 0, 0, 0, 0, 0)) + page.scale(2, 2) + page.scale_by(0.5) + page.scale_to(100, 100) + + page = writer.pages[0] + page.compress_content_streams() + page.extract_text() + + +def bench_page_ops(loops): + """ + Apply various page operations. + + Rotation, scaling, translation, content stream compression, text extraction + """ + content = (DATA_DIR / "libreoffice-writer-password.pdf").read_bytes() + stream = io.BytesIO(content) + + t0 = pyperf.perf_counter() + for _ in range(loops): + page_ops(stream, "openpassword") + return pyperf.perf_counter() - t0 + + +BENCHMARKS = ("page_ops",) + + +def add_cmdline_args(cmd, args): + if args.benchmark: + cmd.append(args.benchmark) + + +if __name__ == "__main__": + runner = pyperf.Runner(add_cmdline_args=add_cmdline_args) + runner.metadata["description"] = "pypdf benchmark" + runner.argparser.add_argument("benchmark", nargs="?", choices=BENCHMARKS) + + args = runner.parse_args() + if args.benchmark: + benchmarks = (args.benchmark,) + else: + benchmarks = BENCHMARKS + + for bench in benchmarks: + name = f"pypdf_{bench}" + func = globals()[f"bench_{bench}"] + runner.bench_time_func(name, func) From 27500fb34eb9211c91d3e07abb8e2bae2ce50769 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 14 Jun 2024 14:52:22 -0400 Subject: [PATCH 2/2] Fix requirements.txt --- pyperformance/data-files/benchmarks/bm_pypdf/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyperformance/data-files/benchmarks/bm_pypdf/requirements.txt b/pyperformance/data-files/benchmarks/bm_pypdf/requirements.txt index b67812cb..728d2160 100644 --- a/pyperformance/data-files/benchmarks/bm_pypdf/requirements.txt +++ b/pyperformance/data-files/benchmarks/bm_pypdf/requirements.txt @@ -1 +1 @@ -pyyaml==4.2.0 +pypdf==4.2.0