From 677510659e054ccf7cd2ab8d6e6582b0876ba365 Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Sun, 20 Sep 2026 15:56:44 +0300 Subject: [PATCH 1/2] Add benchmark for image equality --- Tests/benchmarks.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Tests/benchmarks.py b/Tests/benchmarks.py index f5f4cd8cde5..d02685006c4 100644 --- a/Tests/benchmarks.py +++ b/Tests/benchmarks.py @@ -5,6 +5,7 @@ from __future__ import annotations import hashlib +import operator import os import pathlib import re @@ -728,6 +729,37 @@ def test_offset(bench: BenchmarkFixture, mode: str, size: tuple[int, int]) -> No bench(ImageChops.offset, im, 123, 45) +@pytest.mark.benchmark(group="compare") +@pytest.mark.parametrize("scenario", ["equal", "one-pixel", "inverted"]) +@pytest.mark.parametrize("mode", [*MODES, "I;16"]) +@pytest.mark.parametrize("size", SIZES, ids=_format_size) +def test_equality( + bench: BenchmarkFixture, + mode: str, + size: tuple[int, int], + scenario: str, +) -> None: + im1 = make_pillow_image(mode, size) + if scenario == "inverted": # Differs in almost every pixel + im2 = ImageChops.invert(im1) + elif scenario == "one-pixel": + # Differs in a single pixel halfway through the image in raster order + xy = ((im1.width * im1.height // 2) % im1.width, im1.height // 2) + im2 = im1.copy() + value = im2.getpixel(xy) + assert value is not None + if isinstance(value, tuple): + value = tuple(255 - v for v in value) + else: + value = 255 - value + im2.putpixel(xy, value) + else: # Equal + im2 = im1.copy() + bench.extra_info["label"] = [scenario] + result = bench(operator.eq, im1, im2) + assert result is (scenario == "equal") + + @pytest.mark.benchmark(group="extrema") @pytest.mark.parametrize("mode", ["L", "LA", "I", "F", "RGB", "RGBA", "CMYK"]) @pytest.mark.parametrize("size", SIZES, ids=_format_size) From 474e0e5c7be30cbd908f4d12ffd9be4ce79a7d58 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 21 Sep 2026 14:36:29 +0300 Subject: [PATCH 2/2] Use ==, not operator.eq --- Tests/benchmarks.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/benchmarks.py b/Tests/benchmarks.py index d02685006c4..2be1b49582e 100644 --- a/Tests/benchmarks.py +++ b/Tests/benchmarks.py @@ -5,7 +5,6 @@ from __future__ import annotations import hashlib -import operator import os import pathlib import re @@ -756,7 +755,7 @@ def test_equality( else: # Equal im2 = im1.copy() bench.extra_info["label"] = [scenario] - result = bench(operator.eq, im1, im2) + result = bench(lambda: im1 == im2) assert result is (scenario == "equal")