codeflash-agent/.codeflash/krrt7/odoo/benchmark_image.py
Kevin Turcios 20f6c59f05
Lint and format entire repo, not just packages (#23)
Remove .codeflash/ from ruff extend-exclude, add per-file ignores
for .codeflash/, scripts/, evals/, and plugin/ (benchmark/script
patterns like print, eval, magic values). Remove shebangs. Widen
pre-commit hooks to check the full repo.
2026-04-15 03:16:15 -05:00

172 lines
4.7 KiB
Python

"""
Benchmark for Odoo image processing utilities.
Tests resize, format conversion, and thumbnail generation.
"""
import base64
import io
import os
import sys
import timeit
from PIL import Image
# Add odoo to path
sys.path.insert(0, "/Users/krrt7/Desktop/work/odoo_org/odoo")
# Activating venv programmatically by modifying path
venv_site_packages = (
"/Users/krrt7/Desktop/work/odoo_org/odoo/venv/lib/python3.14/site-packages"
)
if os.path.exists(venv_site_packages):
sys.path.insert(0, venv_site_packages)
try:
from odoo.tools import image
except ImportError as e:
print(f"Failed to import odoo.tools.image: {e}")
print("This benchmark will run PIL operations directly.")
image = None
def create_test_image(width=2048, height=2048):
"""Create a test image in memory."""
img = Image.new("RGB", (width, height), color="red")
# Add some complexity
for i in range(0, width, 100):
for j in range(0, height, 100):
img.putpixel((i, j), (0, 255, 0))
buffer = io.BytesIO()
img.save(buffer, format="PNG")
return buffer.getvalue()
def benchmark_resize_pil(image_data, target_size=(512, 512)):
"""Benchmark PIL resize operation."""
img = Image.open(io.BytesIO(image_data))
img_resized = img.resize(target_size, Image.Resampling.LANCZOS)
buffer = io.BytesIO()
img_resized.save(buffer, format="PNG")
return buffer.getvalue()
def benchmark_thumbnail_pil(image_data, max_size=(256, 256)):
"""Benchmark PIL thumbnail operation."""
img = Image.open(io.BytesIO(image_data))
img.thumbnail(max_size, Image.Resampling.LANCZOS)
buffer = io.BytesIO()
img.save(buffer, format="PNG")
return buffer.getvalue()
def benchmark_format_conversion(image_data):
"""Benchmark format conversion (PNG -> JPEG -> PNG)."""
img = Image.open(io.BytesIO(image_data))
# Convert to JPEG
buffer_jpeg = io.BytesIO()
img_rgb = img.convert("RGB")
img_rgb.save(buffer_jpeg, format="JPEG", quality=85)
# Convert back to PNG
img2 = Image.open(io.BytesIO(buffer_jpeg.getvalue()))
buffer_png = io.BytesIO()
img2.save(buffer_png, format="PNG")
return buffer_png.getvalue()
def benchmark_base64_operations(image_data):
"""Benchmark base64 encoding/decoding."""
encoded = base64.b64encode(image_data)
decoded = base64.b64decode(encoded)
return decoded
def run_benchmarks():
"""Run all image benchmarks."""
print("=" * 80)
print("Image Processing Benchmark")
print("=" * 80)
# Create test images of different sizes
test_sizes = [
(512, 512, "Small (512x512)"),
(2048, 2048, "Medium (2048x2048)"),
(4096, 4096, "Large (4096x4096)"),
]
results = []
for width, height, label in test_sizes:
print(f"\n{label}:")
print("-" * 40)
image_data = create_test_image(width, height)
size_mb = len(image_data) / 1024 / 1024
print(f"Image size: {size_mb:.2f} MB")
# Benchmark resize
time_resize = (
timeit.timeit(
lambda: benchmark_resize_pil(image_data, (512, 512)), number=10
)
/ 10
)
print(f"Resize to 512x512: {time_resize * 1000:.2f} ms")
# Benchmark thumbnail
time_thumbnail = (
timeit.timeit(
lambda: benchmark_thumbnail_pil(image_data, (256, 256)),
number=10,
)
/ 10
)
print(f"Thumbnail to 256x256: {time_thumbnail * 1000:.2f} ms")
# Benchmark format conversion
time_format = (
timeit.timeit(
lambda: benchmark_format_conversion(image_data), number=5
)
/ 5
)
print(
f"Format conversion (PNG->JPEG->PNG): {time_format * 1000:.2f} ms"
)
# Benchmark base64
time_base64 = (
timeit.timeit(
lambda: benchmark_base64_operations(image_data), number=100
)
/ 100
)
print(f"Base64 encode/decode: {time_base64 * 1000:.2f} ms")
results.append(
{
"size": label,
"image_mb": size_mb,
"resize_ms": time_resize * 1000,
"thumbnail_ms": time_thumbnail * 1000,
"format_ms": time_format * 1000,
"base64_ms": time_base64 * 1000,
}
)
# Summary
print("\n" + "=" * 80)
print("SUMMARY")
print("=" * 80)
for r in results:
print(f"\n{r['size']} ({r['image_mb']:.2f} MB):")
print(
f" Total processing time: {r['resize_ms'] + r['thumbnail_ms'] + r['format_ms']:.2f} ms"
)
if __name__ == "__main__":
run_benchmarks()