Skip to content

Commit

Permalink
Put into separate dir like cattrs
Browse files Browse the repository at this point in the history
  • Loading branch information
hynek committed Jul 18, 2024
1 parent bbc5f1e commit 0d5528b
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 6 deletions.
126 changes: 126 additions & 0 deletions bench/test_benchmarks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
"""
Benchmark attrs using CodSpeed.
"""

from __future__ import annotations

import os

import pytest

import attrs


if os.environ.get("CODSPEED_ENV") is None:
pytest.skip("Not running in CodSpeed environment", allow_module_level=True)

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):
C = attrs.make_class(
f"C{i}",
{
"x": attrs.field(type=int),
"y": attrs.field(type=str),
"z": attrs.field(type=dict[str, int]),
},
)

C(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)
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,9 @@ ignore = [
]

[tool.ruff.lint.per-file-ignores]
"bench/**" = [
"INP001", # Benchmarks don't have to be importable.
]
"**/test_*" = [
"ARG005", # we need stub lambdas
"S",
Expand Down
5 changes: 0 additions & 5 deletions tests/test_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,11 @@

from __future__ import annotations

import os

import pytest

import attrs


if os.environ.get("CODSPEED_ENV") is None:
pytest.skip("Not running in CodSpeed environment", allow_module_level=True)

pytestmark = pytest.mark.benchmark()

ROUNDS = 1_000
Expand Down
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ pass_env =
ARCH
PYTHONHASHSEED
PYTHONMALLOC
commands = pytest --codspeed -n auto tests/test_benchmarks.py
commands = pytest --codspeed -n auto bench/test_benchmarks.py


[testenv:docs]
Expand Down

0 comments on commit 0d5528b

Please sign in to comment.