attrs/bench/test_benchmarks.py

122 lines
2.1 KiB
Python

"""
Benchmark attrs using CodSpeed.
"""
from __future__ import annotations
import pytest
import attrs
pytestmark = pytest.mark.benchmark()
ROUNDS = 1_000
def test_create_simple_class():
"""
Benchmark creating a simple class without any extras.
"""
for _ in range(ROUNDS):
@attrs.define
class LocalC:
x: int
y: str
z: dict[str, int]
def test_create_frozen_class():
"""
Benchmark creating a frozen class without any extras.
"""
for _ in range(ROUNDS):
@attrs.frozen
class LocalC:
x: int
y: str
z: dict[str, int]
LocalC(1, "2", {})
def test_create_simple_class_make_class():
"""
Benchmark creating a simple class using attrs.make_class().
"""
for i in range(ROUNDS):
LocalC = attrs.make_class(
f"LocalC{i}",
{
"x": attrs.field(type=int),
"y": attrs.field(type=str),
"z": attrs.field(type=dict[str, int]),
},
)
LocalC(1, "2", {})
@attrs.define
class C:
x: int = 0
y: str = "foo"
z: dict[str, int] = attrs.Factory(dict)
def test_instantiate_no_defaults():
"""
Benchmark instantiating a class without using any defaults.
"""
for _ in range(ROUNDS):
C(1, "2", {})
def test_instantiate_with_defaults():
"""
Benchmark instantiating a class relying on defaults.
"""
for _ in range(ROUNDS):
C()
def test_eq_equal():
"""
Benchmark comparing two equal instances for equality.
"""
c1 = C()
c2 = C()
for _ in range(ROUNDS):
c1 == c2
def test_eq_unequal():
"""
Benchmark comparing two unequal instances for equality.
"""
c1 = C()
c2 = C(1, "bar", {"baz": 42})
for _ in range(ROUNDS):
c1 == c2
@attrs.frozen
class HashableC:
x: int = 0
y: str = "foo"
z: tuple[str] = ("bar",)
def test_hash():
"""
Benchmark hashing an instance.
"""
c = HashableC()
for _ in range(ROUNDS):
hash(c)