Skip to content

Pillow-SIMD x86 operation comparison

Recorded 2026-10-21 on Ubuntu 24.04 · x86_64 (CPU: AMD EPYC 7763 64-Core Processor; Python: 3.12.10; Rust: 1.96.1; image: ubuntu24-20261012.334.1). This page compares only workloads run in that one benchmark run: Pillow 12.1.1, Pillow-SIMD 12.1.1.post0, and the pillow-rs CPU/SIMD profiles.

Pillow-SIMD installs the PIL namespace, so the two Pillow variants are run in isolated environments. The benchmark admits timings only after each source has independently passed the same exact-output parity cases against pillow-rs. These results are separate from the Apple ARM results on the main benchmark page.

This x86-only cohort compares pillow-rs CPU/SIMD, ordinary Pillow 12.1.1, and Pillow-SIMD 12.1.1.post0 on identical workloads and measurement policies. Pillow-SIMD and Pillow were run in separate virtual environments because both install the PIL namespace. pillow-rs CPU/SIMD parity uses regular Pillow; Pillow-SIMD compatibility is checked separately and incompatible baseline cells remain visible with their speed ratios withheld. The matched cohort covers 37 full-size, parity-backed workflow IDs: 32 pipeline-op workloads, the established RGB GaussianBlur case, and getchannel in L, LA, RGB, and RGBA. Each measured source uses the same input and measurement policy per workflow; target profiles appear only when declared by that workload. This cohort uses the Pillow-SIMD default SSE4 build. It is not comparable with the Apple ARM measurements on the main benchmark page. Pillow-SIMD output differed from regular Pillow on 3 workload(s); those baseline cells are retained and no Pillow-SIMD speed ratio is accepted: pipeline-op.filter.material-l-noise-5x5-1024x768, pipeline-op.filter.material-la-nonmatching-5x5-1024x768, pipeline-op.grayscale.material-rgb-noise-1024x768.

Compare each profile with its workload-matched baseline on the same runner. Parallel CPU is measured separately with the opt-in Rayon feature. Pillow-SIMD appears only for its matched x86 workload cohort. Lower time is better.

At a glance

Average speedup is the geometric mean of matched per-case ratios; typical case is the median. Each parity-checked case counts once. Runner and operation types stay separate.

Ubuntu 24.04 · x86_64

pillow-rs · CPU vs Pillow

Individual operations32 matched cases

Faster in 30 of 32 matched cases.

Average speedup: 3× faster

Typical case: 3.7× faster

30 faster0 tied2 slower

  • Slowest caseGrayscale material ycbcr noise 1024x768 · YCbCr · 1024 × 768 · 1 operation · observed_stepspillow-rs · CPU took 672 µs vs Pillow 143 µs · 4.7× slower
  • Fastest caseThumbnail material rgb 1024x768 · RGB · 1024 × 768 · 1 operation · whole workflowpillow-rs · CPU took 279 µs vs Pillow 2.2 ms · 7.88× faster

Complete pipelines5 matched cases

Faster in 4 of 5 matched cases.

Average speedup: 1.55× faster

Typical case: 1.17× faster

4 faster0 tied1 slower

  • Slowest casePil image image getchannel materialized rgb 1024x768 · RGB · 1024 × 768 · 1 operation · observed_stepspillow-rs · CPU took 380 µs vs Pillow 280 µs · 1.36× slower
  • Fastest casePil image image getchannel materialized l 1024x768 · L · 1024 × 768 · 1 operation · observed_stepspillow-rs · CPU took 39.4 µs vs Pillow 121 µs · 3.08× faster
Explore every matched workload on the ratio plot

Per-workload differences

Each point is one exact-output-verified workload. Pillow median time divided by pillow-rs median time means 1× is equal latency, above 1× is faster, and below 1× is slower. The plot is grouped by runner, profile, baseline, and workload type, with slowest cases first. Hover a point for both measured medians.

Parity-verified speed ratio for each workloadEach row is one exact-output-verified workload. The ratio is baseline median time divided by target median time. One times means equal median latency; points to the right are faster and points to the left are slower. Rows are sorted slowest first within each runner and comparison.1/16×1/8×1/4×1/2×1×2×4×8×16×Ubuntu 24.04 · x86_64 · pillow-rs · CPU vs Pillow · individual operations32 workloads · typical 3.7× faster · geomean 3× faster · 30 faster / 2 slower / 0 equalGrayscale material ycbcr noise 1024x768 · YCbCr · 1024 × 768 · 1 operation · observed_stepsGrayscale material ycbcr noise 1024x768 · YCbCr · 1024 × 768 · 1 operation · observed_steps; Pillow median 143 µs; pillow-rs · CPU median 672 µs; 4.7× slowerGrayscale material ycbcr noise 1024x768 · YCbCr · 1024 × 768 · 1 operation · observed_steps; Pillow median 143 µs; pillow-rs · CPU median 672 µs; 4.7× slower4.7× slowerGrayscale material rgb noise 1024x768 · RGB · 1024 × 768 · 1 operation · observed_stepsGrayscale material rgb noise 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 515 µs; pillow-rs · CPU median 1.26 ms; 2.45× slowerGrayscale material rgb noise 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 515 µs; pillow-rs · CPU median 1.26 ms; 2.45× slower2.45× slowerRotate material rgb nearest noise recovered 20261016 1024x768 · RGB · 1024 × 768 · 1 operation · observed_stepsRotate material rgb nearest noise recovered 20261016 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 2.94 ms; pillow-rs · CPU median 2.86 ms; 1.03× fasterRotate material rgb nearest noise recovered 20261016 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 2.94 ms; pillow-rs · CPU median 2.86 ms; 1.03× faster1.03× fasterMerge material rgb l 1024x768 · RGB · 1024 × 768 · 1 operation · observed_stepsMerge material rgb l 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 2.68 ms; pillow-rs · CPU median 2.17 ms; 1.24× fasterMerge material rgb l 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 2.68 ms; pillow-rs · CPU median 2.17 ms; 1.24× faster1.24× fasterThumbnail native f32 1024x768 · F · 1024 × 768 · 1 operation · observed_stepsThumbnail native f32 1024x768 · F · 1024 × 768 · 1 operation · observed_steps; Pillow median 1.87 ms; pillow-rs · CPU median 1.23 ms; 1.52× fasterThumbnail native f32 1024x768 · F · 1024 × 768 · 1 operation · observed_steps; Pillow median 1.87 ms; pillow-rs · CPU median 1.23 ms; 1.52× faster1.52× fasterPosterize material rgb noise 1024x768 · RGB · 1024 × 768 · 1 operation · observed_stepsPosterize material rgb noise 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 2.79 ms; pillow-rs · CPU median 1.75 ms; 1.59× fasterPosterize material rgb noise 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 2.79 ms; pillow-rs · CPU median 1.75 ms; 1.59× faster1.59× fasterRotate material rgba nearest 37deg noise fill 1024x768 · RGBA · 1024 × 768 · 1 operation · observed_stepsRotate material rgba nearest 37deg noise fill 1024x768 · RGBA · 1024 × 768 · 1 operation · observed_steps; Pillow median 6.38 ms; pillow-rs · CPU median 3.75 ms; 1.7× fasterRotate material rgba nearest 37deg noise fill 1024x768 · RGBA · 1024 × 768 · 1 operation · observed_steps; Pillow median 6.38 ms; pillow-rs · CPU median 3.75 ms; 1.7× faster1.7× fasterFilter material la noise 3x3 1024x768 · LA · 1024 × 768 · 2 operations · observed_stepsFilter material la noise 3x3 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 11.5 ms; pillow-rs · CPU median 4.72 ms; 2.43× fasterFilter material la noise 3x3 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 11.5 ms; pillow-rs · CPU median 4.72 ms; 2.43× faster2.43× fasterMaxfilter material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_stepsMaxfilter material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 45.7 ms; pillow-rs · CPU median 18 ms; 2.54× fasterMaxfilter material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 45.7 ms; pillow-rs · CPU median 18 ms; 2.54× faster2.54× fasterConvert mode cmyk to rgb 1024x768 · CMYK · 1024 × 768 · 1 operation · observed_stepsConvert mode cmyk to rgb 1024x768 · CMYK · 1024 × 768 · 1 operation · observed_steps; Pillow median 5.39 ms; pillow-rs · CPU median 2.1 ms; 2.57× fasterConvert mode cmyk to rgb 1024x768 · CMYK · 1024 × 768 · 1 operation · observed_steps; Pillow median 5.39 ms; pillow-rs · CPU median 2.1 ms; 2.57× faster2.57× fasterThumbnail native i32 1024x768 · I · 1024 × 768 · 1 operation · observed_stepsThumbnail native i32 1024x768 · I · 1024 × 768 · 1 operation · observed_steps; Pillow median 5.57 ms; pillow-rs · CPU median 2.07 ms; 2.69× fasterThumbnail native i32 1024x768 · I · 1024 × 768 · 1 operation · observed_steps; Pillow median 5.57 ms; pillow-rs · CPU median 2.07 ms; 2.69× faster2.69× fasterMinfilter material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_stepsMinfilter material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 45 ms; pillow-rs · CPU median 16.3 ms; 2.76× fasterMinfilter material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 45 ms; pillow-rs · CPU median 16.3 ms; 2.76× faster2.76× fasterGaussianblur material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_stepsGaussianblur material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 9.56 ms; pillow-rs · CPU median 3.43 ms; 2.79× fasterGaussianblur material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 9.56 ms; pillow-rs · CPU median 3.43 ms; 2.79× faster2.79× fasterFilter material la noise 5x5 1024x768 · LA · 1024 × 768 · 2 operations · observed_stepsFilter material la noise 5x5 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 26 ms; pillow-rs · CPU median 8.33 ms; 3.12× fasterFilter material la noise 5x5 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 26 ms; pillow-rs · CPU median 8.33 ms; 3.12× faster3.12× fasterFilter material i noise 5x5 1024x768 · I · 1024 × 768 · 2 operations · observed_stepsFilter material i noise 5x5 1024x768 · I · 1024 × 768 · 2 operations · observed_steps; Pillow median 14.4 ms; pillow-rs · CPU median 4.52 ms; 3.2× fasterFilter material i noise 5x5 1024x768 · I · 1024 × 768 · 2 operations · observed_steps; Pillow median 14.4 ms; pillow-rs · CPU median 4.52 ms; 3.2× faster3.2× fasterBoxblur material l noise 1024x768 radius 1 · L · 1024 × 768 · 2 operations · observed_stepsBoxblur material l noise 1024x768 radius 1 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 4.44 ms; pillow-rs · CPU median 1.22 ms; 3.64× fasterBoxblur material l noise 1024x768 radius 1 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 4.44 ms; pillow-rs · CPU median 1.22 ms; 3.64× faster3.64× fasterUnsharpmask material rgb noise 1024x768 radius 2 · RGB · 1024 × 768 · 2 operations · observed_stepsUnsharpmask material rgb noise 1024x768 radius 2 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 42.6 ms; pillow-rs · CPU median 11.4 ms; 3.75× fasterUnsharpmask material rgb noise 1024x768 radius 2 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 42.6 ms; pillow-rs · CPU median 11.4 ms; 3.75× faster3.75× fasterFilter material i bounded noise 5x5 1024x768 · I · 1024 × 768 · 2 operations · observed_stepsFilter material i bounded noise 5x5 1024x768 · I · 1024 × 768 · 2 operations · observed_steps; Pillow median 15.1 ms; pillow-rs · CPU median 4.01 ms; 3.75× fasterFilter material i bounded noise 5x5 1024x768 · I · 1024 × 768 · 2 operations · observed_steps; Pillow median 15.1 ms; pillow-rs · CPU median 4.01 ms; 3.75× faster3.75× fasterFilter material la nonmatching 5x5 1024x768 · LA · 1024 × 768 · 2 operations · observed_stepsFilter material la nonmatching 5x5 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 26 ms; pillow-rs · CPU median 6.44 ms; 4.04× fasterFilter material la nonmatching 5x5 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 26 ms; pillow-rs · CPU median 6.44 ms; 4.04× faster4.04× fasterBoxblur material rgb noise 1024x768 radius 1 · RGB · 1024 × 768 · 2 operations · observed_stepsBoxblur material rgb noise 1024x768 radius 1 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 13.3 ms; pillow-rs · CPU median 3.13 ms; 4.25× fasterBoxblur material rgb noise 1024x768 radius 1 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 13.3 ms; pillow-rs · CPU median 3.13 ms; 4.25× faster4.25× fasterMaxfilter material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_stepsMaxfilter material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 91.9 ms; pillow-rs · CPU median 21.2 ms; 4.33× fasterMaxfilter material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 91.9 ms; pillow-rs · CPU median 21.2 ms; 4.33× faster4.33× fasterMinfilter material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_stepsMinfilter material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 93.5 ms; pillow-rs · CPU median 21.1 ms; 4.42× fasterMinfilter material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 93.5 ms; pillow-rs · CPU median 21.1 ms; 4.42× faster4.42× fasterGaussianblur material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_stepsGaussianblur material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 31.9 ms; pillow-rs · CPU median 6.91 ms; 4.62× fasterGaussianblur material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 31.9 ms; pillow-rs · CPU median 6.91 ms; 4.62× faster4.62× fasterMedianfilter material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_stepsMedianfilter material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 66.4 ms; pillow-rs · CPU median 12.4 ms; 5.38× fasterMedianfilter material l noise 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 66.4 ms; pillow-rs · CPU median 12.4 ms; 5.38× faster5.38× fasterMinfilter material rgb noise 1024x768 · RGB · 1024 × 768 · 2 operations · observed_stepsMinfilter material rgb noise 1024x768 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 137 ms; pillow-rs · CPU median 24.1 ms; 5.67× fasterMinfilter material rgb noise 1024x768 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 137 ms; pillow-rs · CPU median 24.1 ms; 5.67× faster5.67× fasterMaxfilter material rgb noise 1024x768 · RGB · 1024 × 768 · 2 operations · observed_stepsMaxfilter material rgb noise 1024x768 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 137 ms; pillow-rs · CPU median 24.1 ms; 5.68× fasterMaxfilter material rgb noise 1024x768 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 137 ms; pillow-rs · CPU median 24.1 ms; 5.68× faster5.68× fasterMedianfilter material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_stepsMedianfilter material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 132 ms; pillow-rs · CPU median 21.6 ms; 6.11× fasterMedianfilter material la noise 1024x768 · LA · 1024 × 768 · 2 operations · observed_steps; Pillow median 132 ms; pillow-rs · CPU median 21.6 ms; 6.11× faster6.11× fasterMedianfilter material rgb noise 1024x768 · RGB · 1024 × 768 · 2 operations · observed_stepsMedianfilter material rgb noise 1024x768 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 193 ms; pillow-rs · CPU median 31.1 ms; 6.23× fasterMedianfilter material rgb noise 1024x768 · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 193 ms; pillow-rs · CPU median 31.1 ms; 6.23× faster6.23× fasterFilter material l noise 5x5 1024x768 · L · 1024 × 768 · 2 operations · observed_stepsFilter material l noise 5x5 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 12.6 ms; pillow-rs · CPU median 1.96 ms; 6.43× fasterFilter material l noise 5x5 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 12.6 ms; pillow-rs · CPU median 1.96 ms; 6.43× faster6.43× fasterPosterize material l noise 1024x768 · L · 1024 × 768 · 1 operation · observed_stepsPosterize material l noise 1024x768 · L · 1024 × 768 · 1 operation · observed_steps; Pillow median 568 µs; pillow-rs · CPU median 87.3 µs; 6.51× fasterPosterize material l noise 1024x768 · L · 1024 × 768 · 1 operation · observed_steps; Pillow median 568 µs; pillow-rs · CPU median 87.3 µs; 6.51× faster6.51× fasterFilter material l noise flat 5x5 1024x768 · L · 1024 × 768 · 2 operations · observed_stepsFilter material l noise flat 5x5 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 11.9 ms; pillow-rs · CPU median 1.55 ms; 7.64× fasterFilter material l noise flat 5x5 1024x768 · L · 1024 × 768 · 2 operations · observed_steps; Pillow median 11.9 ms; pillow-rs · CPU median 1.55 ms; 7.64× faster7.64× fasterThumbnail material rgb 1024x768 · RGB · 1024 × 768 · 1 operation · whole workflowThumbnail material rgb 1024x768 · RGB · 1024 × 768 · 1 operation · whole workflow; Pillow median 2.2 ms; pillow-rs · CPU median 279 µs; 7.88× fasterThumbnail material rgb 1024x768 · RGB · 1024 × 768 · 1 operation · whole workflow; Pillow median 2.2 ms; pillow-rs · CPU median 279 µs; 7.88× faster7.88× fasterUbuntu 24.04 · x86_64 · pillow-rs · CPU vs Pillow · pipelines5 workloads · typical 1.17× faster · geomean 1.55× faster · 4 faster / 1 slower / 0 equalPil image image getchannel materialized rgb 1024x768 · RGB · 1024 × 768 · 1 operation · observed_stepsPil image image getchannel materialized rgb 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 280 µs; pillow-rs · CPU median 380 µs; 1.36× slowerPil image image getchannel materialized rgb 1024x768 · RGB · 1024 × 768 · 1 operation · observed_steps; Pillow median 280 µs; pillow-rs · CPU median 380 µs; 1.36× slower1.36× slowerPil image image getchannel materialized la 1024x768 · LA · 1024 × 768 · 1 operation · observed_stepsPil image image getchannel materialized la 1024x768 · LA · 1024 × 768 · 1 operation · observed_steps; Pillow median 265 µs; pillow-rs · CPU median 238 µs; 1.12× fasterPil image image getchannel materialized la 1024x768 · LA · 1024 × 768 · 1 operation · observed_steps; Pillow median 265 µs; pillow-rs · CPU median 238 µs; 1.12× faster1.12× fasterPil image image getchannel materialized rgba 1024x768 · RGBA · 1024 × 768 · 1 operation · observed_stepsPil image image getchannel materialized rgba 1024x768 · RGBA · 1024 × 768 · 1 operation · observed_steps; Pillow median 280 µs; pillow-rs · CPU median 241 µs; 1.17× fasterPil image image getchannel materialized rgba 1024x768 · RGBA · 1024 × 768 · 1 operation · observed_steps; Pillow median 280 µs; pillow-rs · CPU median 241 µs; 1.17× faster1.17× fasterPil imagefilter gaussianblur standard · RGB · 1024 × 768 · 2 operations · observed_stepsPil imagefilter gaussianblur standard · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 30.4 ms; pillow-rs · CPU median 10.1 ms; 3.03× fasterPil imagefilter gaussianblur standard · RGB · 1024 × 768 · 2 operations · observed_steps; Pillow median 30.4 ms; pillow-rs · CPU median 10.1 ms; 3.03× faster3.03× fasterPil image image getchannel materialized l 1024x768 · L · 1024 × 768 · 1 operation · observed_stepsPil image image getchannel materialized l 1024x768 · L · 1024 × 768 · 1 operation · observed_steps; Pillow median 121 µs; pillow-rs · CPU median 39.4 µs; 3.08× fasterPil image image getchannel materialized l 1024x768 · L · 1024 × 768 · 1 operation · observed_steps; Pillow median 121 µs; pillow-rs · CPU median 39.4 µs; 3.08× faster3.08× faster

Timing-only results remain in the tables but are excluded from this parity-verified plot and summary.

Use the individual workload tables to compare absolute latency, mode, and measurement boundaries.

Pipeline benchmarks

Composed, matrix, lifecycle and quick workloads. Current snapshot: 5 pipelines.

Median time per pipeline workload; each backend is compared with its workload-matched Pillow timing.
BaselineMedian · vs PillowMedian · vs PillowMedian · vs PillowMedian · vs PillowMedian · vs PillowLowest medianAmong comparable implementations
Pil imagefilter gaussianblur standard1024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64OperationsRGB30.4 msBaselinePillow. Baseline.10.1 ms3.03× fasterpillow-rs · CPU. Output comparison passed.10.8 ms2.8× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured9.58 ms3.17× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.Pillow-SIMD · SSE4Output comparison passed; Pillow-SIMD output matched regular Pillow
Pil image image getchannel materialized l 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64OperationsL121 µsBaselinePillow. Baseline.39.4 µs3.08× fasterpillow-rs · CPU. Output comparison passed.88.6 µs1.37× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured109 µs1.11× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Pil image image getchannel materialized rgb 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64OperationsRGB280 µsBaselinePillow. Baseline.380 µs1.36× slowerpillow-rs · CPU. Output comparison passed.83.8 µs3.34× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured207 µs1.35× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Pil image image getchannel materialized la 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64OperationsLA265 µsBaselinePillow. Baseline.238 µs1.12× fasterpillow-rs · CPU. Output comparison passed.85.1 µs3.12× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured202 µs1.31× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Pil image image getchannel materialized rgba 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64OperationsRGBA280 µsBaselinePillow. Baseline.241 µs1.17× fasterpillow-rs · CPU. Output comparison passed.109 µs2.56× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured218 µs1.29× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow

Individual operation benchmarks

Single-operation workloads; each row retains its declared timing boundary. Current snapshot: 32 operation workloads.

Median time per individual operation workload; mode and operation type are explicit columns.
BaselineMedian · vs PillowMedian · vs PillowMedian · vs PillowMedian · vs PillowMedian · vs PillowLowest medianAmong comparable implementations
Boxblur material l noise 1024x768 radius 11024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodL4.44 msBaselinePillow. Baseline.1.22 ms3.64× fasterpillow-rs · CPU. Output comparison passed.931 µs4.77× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured4.45 ms0.236% more timePillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Boxblur material rgb noise 1024x768 radius 11024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodRGB13.3 msBaselinePillow. Baseline.3.13 ms4.25× fasterpillow-rs · CPU. Output comparison passed.2.17 ms6.13× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured5.87 ms2.26× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Gaussianblur material l noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64pointL9.56 msBaselinePillow. Baseline.3.43 ms2.79× fasterpillow-rs · CPU. Output comparison passed.4.32 ms2.21× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured9.58 ms0.164% more timePillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Gaussianblur material la noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64pointLA31.9 msBaselinePillow. Baseline.6.91 ms4.62× fasterpillow-rs · CPU. Output comparison passed.7.38 ms4.32× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured8.76 ms3.64× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Unsharpmask material rgb noise 1024x768 radius 21024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodRGB42.6 msBaselinePillow. Baseline.11.4 ms3.75× fasterpillow-rs · CPU. Output comparison passed.10.8 ms3.96× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured21.6 ms1.97× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Convert mode cmyk to rgb 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64pointCMYK5.39 msBaselinePillow. Baseline.2.1 ms2.57× fasterpillow-rs · CPU. Output comparison passed.2.23 ms2.42× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured3.66 ms1.47× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Thumbnail material rgb 1024x7681024 × 768 · 1 operation · whole workflowUbuntu 24.04 · x86_64pointRGB2.2 msBaselinePillow. Baseline.279 µs7.88× fasterpillow-rs · CPU. Output comparison passed.456 µs4.83× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured590 µs3.73× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Merge material rgb l 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64pointRGB2.68 msBaselinePillow. Baseline.2.17 ms1.24× fasterpillow-rs · CPU. Output comparison passed.1.69 ms1.59× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured2.7 ms1.01× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Posterize material l noise 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64pointL568 µsBaselinePillow. Baseline.87.3 µs6.51× fasterpillow-rs · CPU. Output comparison passed.95 µs5.98× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured535 µs1.06× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Posterize material rgb noise 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64pointRGB2.79 msBaselinePillow. Baseline.1.75 ms1.59× fasterpillow-rs · CPU. Output comparison passed.1.19 ms2.35× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured2.81 ms1.01× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Medianfilter material l noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodL66.4 msBaselinePillow. Baseline.12.4 ms5.38× fasterpillow-rs · CPU. Output comparison passed.13.5 ms4.92× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured68 ms1.02× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Medianfilter material la noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodLA132 msBaselinePillow. Baseline.21.6 ms6.11× fasterpillow-rs · CPU. Output comparison passed.26.8 ms4.92× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured136 ms1.03× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Medianfilter material rgb noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodRGB193 msBaselinePillow. Baseline.31.1 ms6.23× fasterpillow-rs · CPU. Output comparison passed.43.8 ms4.42× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured205 ms1.06× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Maxfilter material rgb noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodRGB137 msBaselinePillow. Baseline.24.1 ms5.68× fasterpillow-rs · CPU. Output comparison passed.20.6 ms6.63× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured151 ms1.1× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Minfilter material rgb noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodRGB137 msBaselinePillow. Baseline.24.1 ms5.67× fasterpillow-rs · CPU. Output comparison passed.20.9 ms6.53× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured146 ms1.07× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Maxfilter material l noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodL45.7 msBaselinePillow. Baseline.18 ms2.54× fasterpillow-rs · CPU. Output comparison passed.7.15 ms6.39× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured47.5 ms1.04× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Maxfilter material la noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodLA91.9 msBaselinePillow. Baseline.21.2 ms4.33× fasterpillow-rs · CPU. Output comparison passed.13.7 ms6.7× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured98.2 ms1.07× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Minfilter material l noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodL45 msBaselinePillow. Baseline.16.3 ms2.76× fasterpillow-rs · CPU. Output comparison passed.7 ms6.43× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured49.4 ms1.1× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Minfilter material la noise 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodLA93.5 msBaselinePillow. Baseline.21.1 ms4.42× fasterpillow-rs · CPU. Output comparison passed.13.9 ms6.73× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured99.7 ms1.07× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Grayscale material rgb noise 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64pointRGB515 µsBaselinePillow. Baseline.1.26 ms2.45× slowerpillow-rs · CPU. Output comparison passed.785 µs1.52× slowerpillow-rs · SIMD. Output comparison passed.Not measuredNot measured327 µsNot comparablePillow-SIMD · SSE4. Output differs · speed comparison withheld.pillow-rs · SIMDOutput comparison passed; Output differs · speed comparison withheld
Grayscale material ycbcr noise 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64pointYCbCr143 µsBaselinePillow. Baseline.672 µs4.7× slowerpillow-rs · CPU. Output comparison passed.630 µs4.4× slowerpillow-rs · SIMD. Output comparison passed.Not measuredNot measured145 µs1.02× slowerPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.Pillow-SIMD · SSE4Output comparison passed; Pillow-SIMD output matched regular Pillow
Thumbnail native f32 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64geometryF1.87 msBaselinePillow. Baseline.1.23 ms1.52× fasterpillow-rs · CPU. Output comparison passed.1.48 ms1.26× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured1.75 ms1.07× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Thumbnail native i32 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64geometryI5.57 msBaselinePillow. Baseline.2.07 ms2.69× fasterpillow-rs · CPU. Output comparison passed.1.79 ms3.12× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured5.36 ms1.04× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Filter material l noise 5x5 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodL12.6 msBaselinePillow. Baseline.1.96 ms6.43× fasterpillow-rs · CPU. Output comparison passed.1.19 ms10.6× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured4.05 msNot comparablePillow-SIMD · SSE4. Output differs · speed comparison withheld.pillow-rs · SIMDOutput comparison passed; Output differs · speed comparison withheld
Filter material l noise flat 5x5 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodL11.9 msBaselinePillow. Baseline.1.55 ms7.64× fasterpillow-rs · CPU. Output comparison passed.1.25 ms9.5× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured4.05 ms2.93× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Filter material la noise 5x5 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodLA26 msBaselinePillow. Baseline.8.33 ms3.12× fasterpillow-rs · CPU. Output comparison passed.2.02 ms12.9× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured5.39 ms4.82× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Filter material la nonmatching 5x5 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodLA26 msBaselinePillow. Baseline.6.44 ms4.04× fasterpillow-rs · CPU. Output comparison passed.3.27 ms7.96× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured5.4 msNot comparablePillow-SIMD · SSE4. Output differs · speed comparison withheld.pillow-rs · SIMDOutput comparison passed; Output differs · speed comparison withheld
Filter material la noise 3x3 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodLA11.5 msBaselinePillow. Baseline.4.72 ms2.43× fasterpillow-rs · CPU. Output comparison passed.4.77 ms2.41× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured2.9 ms3.95× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.Pillow-SIMD · SSE4Output comparison passed; Pillow-SIMD output matched regular Pillow
Filter material i noise 5x5 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodI14.4 msBaselinePillow. Baseline.4.52 ms3.2× fasterpillow-rs · CPU. Output comparison passed.5.66 ms2.55× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured12.8 ms1.13× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Filter material i bounded noise 5x5 1024x7681024 × 768 · 2 operations · observed_stepsUbuntu 24.04 · x86_64neighborhoodI15.1 msBaselinePillow. Baseline.4.01 ms3.75× fasterpillow-rs · CPU. Output comparison passed.5.79 ms2.6× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured12.9 ms1.17× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow
Rotate material rgb nearest noise recovered 20261016 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64pointRGB2.94 msBaselinePillow. Baseline.2.86 ms1.03× fasterpillow-rs · CPU. Output comparison passed.1.47 ms2× fasterpillow-rs · SIMD. Output comparison passed.Not measuredNot measured2.94 ms0.0325% more timePillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · SIMDOutput comparison passed; Pillow-SIMD output matched regular Pillow
Rotate material rgba nearest 37deg noise fill 1024x7681024 × 768 · 1 operation · observed_stepsUbuntu 24.04 · x86_64geometryRGBA6.38 msBaselinePillow. Baseline.3.75 ms1.7× fasterpillow-rs · CPU. Output comparison passed.Not measuredNot measuredNot measured5.95 ms1.07× fasterPillow-SIMD · SSE4. Pillow-SIMD output matched regular Pillow.pillow-rs · CPUOutput comparison passed; Pillow-SIMD output matched regular Pillow

37 recorded workloads: 5 pipeline and 32 individual-operation rows · 2026-10-21 · Ubuntu 24.04 · x86_64

Python API operations and complete pipelines, including their declared setup and output steps. CPU, SIMD and GPU are separate implementations.

Matched source and parity runs

Source Package version Benchmark run Parity run
pillow 12.1.1 migration-benchmark-15a619ce4f8547ff84fb69e2fa482c31 migration-parity-benchmark-gate-56d27f0a20624474867fbc4268210f38
pillow-simd 12.1.1.post0 migration-benchmark-231f0c51d0f845048dcc2e801d85d6d7 migration-parity-benchmark-gate-56d27f0a20624474867fbc4268210f38

Workload-level evidence

Workload Mode Implementation Median µs Samples Output/backend evidence
pipeline-op.boxblur.material-l-noise-1024x768-radius-1 L pillow 4,443.401 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.boxblur.material-l-noise-1024x768-radius-1 L python-cpu 1,220.286 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.boxblur.material-l-noise-1024x768-radius-1 L python-simd 931.054 100 completed; parity_pass: pass; simd → simd
pipeline-op.boxblur.material-rgb-noise-1024x768-radius-1 RGB pillow 13,285.029 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.boxblur.material-rgb-noise-1024x768-radius-1 RGB python-cpu 3,125.683 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.boxblur.material-rgb-noise-1024x768-radius-1 RGB python-simd 2,168.686 100 completed; parity_pass: pass; simd → simd
pipeline-op.gaussianblur.material-l-noise-1024x768 L pillow 9,560.385 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.gaussianblur.material-l-noise-1024x768 L python-cpu 3,429.735 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.gaussianblur.material-l-noise-1024x768 L python-simd 4,319.062 100 completed; parity_pass: pass; simd → simd
pipeline-op.gaussianblur.material-la-noise-1024x768 LA pillow 31,895.100 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.gaussianblur.material-la-noise-1024x768 LA python-cpu 6,910.231 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.gaussianblur.material-la-noise-1024x768 LA python-simd 7,376.618 100 completed; parity_pass: pass; simd → simd
pipeline-op.unsharpmask.material-rgb-noise-1024x768-radius-2 RGB pillow 42,599.025 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.unsharpmask.material-rgb-noise-1024x768-radius-2 RGB python-cpu 11,360.725 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.unsharpmask.material-rgb-noise-1024x768-radius-2 RGB python-simd 10,764.781 100 completed; parity_pass: pass; simd → simd
pipeline-op.convert-mode-cmyk-to-rgb-1024x768 CMYK pillow 5,386.092 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.convert-mode-cmyk-to-rgb-1024x768 CMYK python-cpu 2,099.300 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.convert-mode-cmyk-to-rgb-1024x768 CMYK python-simd 2,229.160 100 completed; parity_pass: pass; simd → simd
pipeline-op.thumbnail.material-rgb-1024x768 RGB pillow 2,203.553 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.thumbnail.material-rgb-1024x768 RGB python-cpu 279.483 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.thumbnail.material-rgb-1024x768 RGB python-simd 456.472 100 completed; parity_pass: pass; simd → simd
pipeline-op.merge.material-rgb-l-1024x768 RGB pillow 2,682.023 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.merge.material-rgb-l-1024x768 RGB python-cpu 2,167.757 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.merge.material-rgb-l-1024x768 RGB python-simd 1,688.213 100 completed; parity_pass: pass; simd → simd
pipeline-op.posterize.material-l-noise-1024x768 L pillow 568.261 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.posterize.material-l-noise-1024x768 L python-cpu 87.318 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.posterize.material-l-noise-1024x768 L python-simd 95.043 100 completed; parity_pass: pass; simd → simd
pipeline-op.posterize.material-rgb-noise-1024x768 RGB pillow 2,788.367 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.posterize.material-rgb-noise-1024x768 RGB python-cpu 1,749.996 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.posterize.material-rgb-noise-1024x768 RGB python-simd 1,185.770 100 completed; parity_pass: pass; simd → simd
pipeline-op.medianfilter.material-l-noise-1024x768 L pillow 66,407.862 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.medianfilter.material-l-noise-1024x768 L python-cpu 12,354.336 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.medianfilter.material-l-noise-1024x768 L python-simd 13,504.724 100 completed; parity_pass: pass; simd → simd
pipeline-op.medianfilter.material-la-noise-1024x768 LA pillow 132,056.009 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.medianfilter.material-la-noise-1024x768 LA python-cpu 21,625.999 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.medianfilter.material-la-noise-1024x768 LA python-simd 26,814.144 100 completed; parity_pass: pass; simd → simd
pipeline-op.medianfilter.material-rgb-noise-1024x768 RGB pillow 193,491.458 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.medianfilter.material-rgb-noise-1024x768 RGB python-cpu 31,076.338 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.medianfilter.material-rgb-noise-1024x768 RGB python-simd 43,809.310 100 completed; parity_pass: pass; simd → simd
pipeline-op.maxfilter.material-rgb-noise-1024x768 RGB pillow 136,804.921 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.maxfilter.material-rgb-noise-1024x768 RGB python-cpu 24,087.931 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.maxfilter.material-rgb-noise-1024x768 RGB python-simd 20,623.565 100 completed; parity_pass: pass; simd → simd
pipeline-op.minfilter.material-rgb-noise-1024x768 RGB pillow 136,687.663 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.minfilter.material-rgb-noise-1024x768 RGB python-cpu 24,115.332 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.minfilter.material-rgb-noise-1024x768 RGB python-simd 20,926.029 100 completed; parity_pass: pass; simd → simd
pipeline-op.maxfilter.material-l-noise-1024x768 L pillow 45,742.084 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.maxfilter.material-l-noise-1024x768 L python-cpu 17,996.262 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.maxfilter.material-l-noise-1024x768 L python-simd 7,152.801 100 completed; parity_pass: pass; simd → simd
pipeline-op.maxfilter.material-la-noise-1024x768 LA pillow 91,868.298 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.maxfilter.material-la-noise-1024x768 LA python-cpu 21,225.220 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.maxfilter.material-la-noise-1024x768 LA python-simd 13,702.446 100 completed; parity_pass: pass; simd → simd
pipeline-op.minfilter.material-l-noise-1024x768 L pillow 45,007.355 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.minfilter.material-l-noise-1024x768 L python-cpu 16,314.076 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.minfilter.material-l-noise-1024x768 L python-simd 7,003.066 100 completed; parity_pass: pass; simd → simd
pipeline-op.minfilter.material-la-noise-1024x768 LA pillow 93,467.211 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.minfilter.material-la-noise-1024x768 LA python-cpu 21,133.570 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.minfilter.material-la-noise-1024x768 LA python-simd 13,889.540 100 completed; parity_pass: pass; simd → simd
pipeline-op.grayscale.material-rgb-noise-1024x768 RGB pillow 514.942 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.grayscale.material-rgb-noise-1024x768 RGB python-cpu 1,260.393 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.grayscale.material-rgb-noise-1024x768 RGB python-simd 785.061 100 completed; parity_pass: pass; simd → simd
pipeline-op.grayscale.material-ycbcr-noise-1024x768 YCbCr pillow 143.022 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.grayscale.material-ycbcr-noise-1024x768 YCbCr python-cpu 672.109 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.grayscale.material-ycbcr-noise-1024x768 YCbCr python-simd 629.791 100 completed; parity_pass: pass; simd → simd
pipeline-op.thumbnail.native-f32-1024x768 F pillow 1,868.807 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.thumbnail.native-f32-1024x768 F python-cpu 1,229.216 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.thumbnail.native-f32-1024x768 F python-simd 1,484.653 100 completed; parity_pass: pass; simd → simd
pipeline-op.thumbnail.native-i32-1024x768 I pillow 5,572.069 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.thumbnail.native-i32-1024x768 I python-cpu 2,071.054 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.thumbnail.native-i32-1024x768 I python-simd 1,787.804 100 completed; parity_pass: pass; simd → simd
pipeline-op.filter.material-l-noise-5x5-1024x768 L pillow 12,614.929 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.filter.material-l-noise-5x5-1024x768 L python-cpu 1,961.496 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.filter.material-l-noise-5x5-1024x768 L python-simd 1,185.389 100 completed; parity_pass: pass; simd → simd
pipeline-op.filter.material-l-noise-flat-5x5-1024x768 L pillow 11,862.164 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.filter.material-l-noise-flat-5x5-1024x768 L python-cpu 1,552.843 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.filter.material-l-noise-flat-5x5-1024x768 L python-simd 1,249.049 100 completed; parity_pass: pass; simd → simd
pipeline-op.filter.material-la-noise-5x5-1024x768 LA pillow 25,980.285 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.filter.material-la-noise-5x5-1024x768 LA python-cpu 8,327.507 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.filter.material-la-noise-5x5-1024x768 LA python-simd 2,019.704 100 completed; parity_pass: pass; simd → simd
pipeline-op.filter.material-la-nonmatching-5x5-1024x768 LA pillow 25,994.562 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.filter.material-la-nonmatching-5x5-1024x768 LA python-cpu 6,438.567 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.filter.material-la-nonmatching-5x5-1024x768 LA python-simd 3,265.797 100 completed; parity_pass: pass; simd → simd
pipeline-op.filter.material-la-noise-3x3-1024x768 LA pillow 11,481.015 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.filter.material-la-noise-3x3-1024x768 LA python-cpu 4,721.932 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.filter.material-la-noise-3x3-1024x768 LA python-simd 4,765.635 100 completed; parity_pass: pass; simd → simd
pipeline-op.filter.material-i-noise-5x5-1024x768 I pillow 14,448.288 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.filter.material-i-noise-5x5-1024x768 I python-cpu 4,521.573 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.filter.material-i-noise-5x5-1024x768 I python-simd 5,663.172 100 completed; parity_pass: pass; simd → simd
pipeline-op.filter.material-i-bounded-noise-5x5-1024x768 I pillow 15,055.198 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.filter.material-i-bounded-noise-5x5-1024x768 I python-cpu 4,014.099 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.filter.material-i-bounded-noise-5x5-1024x768 I python-simd 5,792.338 100 completed; parity_pass: pass; simd → simd
pipeline-op.rotate.material-rgb-nearest-noise-recovered-20261016-1024x768 RGB pillow 2,941.822 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.rotate.material-rgb-nearest-noise-recovered-20261016-1024x768 RGB python-cpu 2,862.403 100 completed; parity_pass: pass; cpu → cpu
pipeline-op.rotate.material-rgb-nearest-noise-recovered-20261016-1024x768 RGB python-simd 1,468.062 100 completed; parity_pass: pass; simd → simd
pipeline-op.rotate.material-rgba-nearest-37deg-noise-fill-1024x768 RGBA pillow 6,382.981 100 completed; parity_pass: pass; pillow → pillow
pipeline-op.rotate.material-rgba-nearest-37deg-noise-fill-1024x768 RGBA python-cpu 3,749.189 100 completed; parity_pass: pass; cpu → cpu
pil-imagefilter.gaussianblur.standard RGB pillow 30,419.845 100 completed; parity_pass: pass; pillow → pillow
pil-imagefilter.gaussianblur.standard RGB python-cpu 10,052.572 100 completed; parity_pass: pass; cpu → cpu
pil-imagefilter.gaussianblur.standard RGB python-simd 10,846.753 100 completed; parity_pass: pass; simd → simd
pil-image-image.getchannel.materialized.l-1024x768 L pillow 121.311 100 completed; parity_pass: pass; pillow → pillow
pil-image-image.getchannel.materialized.l-1024x768 L python-cpu 39.424 100 completed; parity_pass: pass; cpu → cpu
pil-image-image.getchannel.materialized.l-1024x768 L python-simd 88.620 100 completed; parity_pass: pass; simd → simd
pil-image-image.getchannel.materialized.rgb-1024x768 RGB pillow 279.602 100 completed; parity_pass: pass; pillow → pillow
pil-image-image.getchannel.materialized.rgb-1024x768 RGB python-cpu 380.361 100 completed; parity_pass: pass; cpu → cpu
pil-image-image.getchannel.materialized.rgb-1024x768 RGB python-simd 83.772 100 completed; parity_pass: pass; simd → simd
pil-image-image.getchannel.materialized.la-1024x768 LA pillow 265.435 100 completed; parity_pass: pass; pillow → pillow
pil-image-image.getchannel.materialized.la-1024x768 LA python-cpu 238.004 100 completed; parity_pass: pass; cpu → cpu
pil-image-image.getchannel.materialized.la-1024x768 LA python-simd 85.059 100 completed; parity_pass: pass; simd → simd
pil-image-image.getchannel.materialized.rgba-1024x768 RGBA pillow 280.284 100 completed; parity_pass: pass; pillow → pillow
pil-image-image.getchannel.materialized.rgba-1024x768 RGBA python-cpu 240.574 100 completed; parity_pass: pass; cpu → cpu
pil-image-image.getchannel.materialized.rgba-1024x768 RGBA python-simd 109.429 100 completed; parity_pass: pass; simd → simd
pipeline-op.boxblur.material-l-noise-1024x768-radius-1 L pillow-simd 4,453.895 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.boxblur.material-rgb-noise-1024x768-radius-1 RGB pillow-simd 5,870.788 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.gaussianblur.material-l-noise-1024x768 L pillow-simd 9,576.044 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.gaussianblur.material-la-noise-1024x768 LA pillow-simd 8,758.592 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.unsharpmask.material-rgb-noise-1024x768-radius-2 RGB pillow-simd 21,579.616 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.convert-mode-cmyk-to-rgb-1024x768 CMYK pillow-simd 3,662.311 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.thumbnail.material-rgb-1024x768 RGB pillow-simd 590.278 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.merge.material-rgb-l-1024x768 RGB pillow-simd 2,703.490 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.posterize.material-l-noise-1024x768 L pillow-simd 535.024 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.posterize.material-rgb-noise-1024x768 RGB pillow-simd 2,813.867 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.medianfilter.material-l-noise-1024x768 L pillow-simd 67,976.042 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.medianfilter.material-la-noise-1024x768 LA pillow-simd 136,044.523 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.medianfilter.material-rgb-noise-1024x768 RGB pillow-simd 205,486.457 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.maxfilter.material-rgb-noise-1024x768 RGB pillow-simd 150,568.542 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.minfilter.material-rgb-noise-1024x768 RGB pillow-simd 146,498.686 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.maxfilter.material-l-noise-1024x768 L pillow-simd 47,483.084 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.maxfilter.material-la-noise-1024x768 LA pillow-simd 98,182.954 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.minfilter.material-l-noise-1024x768 L pillow-simd 49,392.347 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.minfilter.material-la-noise-1024x768 LA pillow-simd 99,672.582 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.grayscale.material-rgb-noise-1024x768 RGB pillow-simd 326.841 100 completed; Pillow-SIMD compatibility: fail; pillow-simd → pillow-simd
pipeline-op.grayscale.material-ycbcr-noise-1024x768 YCbCr pillow-simd 145.371 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.thumbnail.native-f32-1024x768 F pillow-simd 1,752.864 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.thumbnail.native-i32-1024x768 I pillow-simd 5,359.658 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.filter.material-l-noise-5x5-1024x768 L pillow-simd 4,049.775 100 completed; Pillow-SIMD compatibility: fail; pillow-simd → pillow-simd
pipeline-op.filter.material-l-noise-flat-5x5-1024x768 L pillow-simd 4,049.735 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.filter.material-la-noise-5x5-1024x768 LA pillow-simd 5,385.305 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.filter.material-la-nonmatching-5x5-1024x768 LA pillow-simd 5,395.283 100 completed; Pillow-SIMD compatibility: fail; pillow-simd → pillow-simd
pipeline-op.filter.material-la-noise-3x3-1024x768 LA pillow-simd 2,903.980 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.filter.material-i-noise-5x5-1024x768 I pillow-simd 12,779.783 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.filter.material-i-bounded-noise-5x5-1024x768 I pillow-simd 12,892.733 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.rotate.material-rgb-nearest-noise-recovered-20261016-1024x768 RGB pillow-simd 2,942.778 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pipeline-op.rotate.material-rgba-nearest-37deg-noise-fill-1024x768 RGBA pillow-simd 5,952.751 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pil-imagefilter.gaussianblur.standard RGB pillow-simd 9,582.246 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pil-image-image.getchannel.materialized.l-1024x768 L pillow-simd 109.340 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pil-image-image.getchannel.materialized.rgb-1024x768 RGB pillow-simd 206.710 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pil-image-image.getchannel.materialized.la-1024x768 LA pillow-simd 202.173 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd
pil-image-image.getchannel.materialized.rgba-1024x768 RGBA pillow-simd 217.667 100 completed; Pillow-SIMD compatibility: pass; pillow-simd → pillow-simd

Measurement notes

  • This x86-only cohort compares pillow-rs CPU/SIMD, ordinary Pillow 12.1.1, and Pillow-SIMD 12.1.1.post0 on identical workloads and measurement policies.
  • Pillow-SIMD and Pillow were run in separate virtual environments because both install the PIL namespace. pillow-rs CPU/SIMD parity uses regular Pillow; Pillow-SIMD compatibility is checked separately and incompatible baseline cells remain visible with their speed ratios withheld.
  • The matched cohort covers 37 full-size, parity-backed workflow IDs: 32 pipeline-op workloads, the established RGB GaussianBlur case, and getchannel in L, LA, RGB, and RGBA. Each measured source uses the same input and measurement policy per workflow; target profiles appear only when declared by that workload.
  • This cohort uses the Pillow-SIMD default SSE4 build. It is not comparable with the Apple ARM measurements on the main benchmark page.
  • Pillow-SIMD output differed from regular Pillow on 3 workload(s); those baseline cells are retained and no Pillow-SIMD speed ratio is accepted: pipeline-op.filter.material-l-noise-5x5-1024x768, pipeline-op.filter.material-la-nonmatching-5x5-1024x768, pipeline-op.grayscale.material-rgb-noise-1024x768.

Source revision: 5db7197532eb08b37d748a78fb789545ab8aa577 · Run: migration-benchmark-15a619ce4f8547ff84fb69e2fa482c31+migration-benchmark-231f0c51d0f845048dcc2e801d85d6d7 · Policy: Paired x86 cohort; pillow-rs CPU/SIMD correctness is gated against regular Pillow 12.1.1. Pillow-SIMD timings are compared only where its outputs also match regular Pillow..

Download the public measurement data or see the contributor benchmark guide.