From 3bbfe66ebec60a00dd6620ee69870e16853457c3 Mon Sep 17 00:00:00 2001 From: Joseph Perez Date: Tue, 22 Feb 2022 17:28:28 +0100 Subject: [PATCH] Add pyserde to benchmark --- benchmark/benchmarks/serde.py | 65 +++++++++++++++++++++++++++++++++++ benchmark/main.py | 2 +- benchmark/requirements.txt | 1 + 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 benchmark/benchmarks/serde.py diff --git a/benchmark/benchmarks/serde.py b/benchmark/benchmarks/serde.py new file mode 100644 index 00000000..1cd2504e --- /dev/null +++ b/benchmark/benchmarks/serde.py @@ -0,0 +1,65 @@ +from dataclasses import dataclass +from datetime import datetime +from typing import Optional + +import serde +from common import Benchmark, Methods, Payment +from serde.core import SETTINGS + +SETTINGS["debug"] = True + + +@serde.serde +@dataclass(frozen=True) +class Message: + title: str + body: str + addresses: Optional[list[str]] = None + persistence: Optional[int] = None + + +@serde.serde +@dataclass(frozen=True) +class Client: + id: int + firstName: str + lastName: str + + def __post_init__(self): # The only way I've found to add constraints + if self.id < 0: + raise ValueError + + +@serde.serde +@dataclass(frozen=True) +class Item: + name: str + price: float + quantity: int = 1 + + def __post_init__(self): + if self.price < 0 or self.quantity < 1: + raise ValueError + + +@serde.serde +@dataclass(frozen=True) +class Receipt: + store: str + address: str + date: datetime + items: list[Item] + payment: Payment + client: Optional[Client] = None + specialOffers: Optional[float] = None + + def __post_init__(self): + if self.specialOffers is not None and self.specialOffers < 0: + raise ValueError + + +def methods(cls: type) -> Methods: + return Methods(lambda data: serde.from_dict(cls, data), serde.to_dict) + + +benchmarks = Benchmark(methods(Message), methods(Receipt), "pyserde") diff --git a/benchmark/main.py b/benchmark/main.py index a3999e06..5f443638 100644 --- a/benchmark/main.py +++ b/benchmark/main.py @@ -27,7 +27,7 @@ def time_it(func: Callable, arg: Any) -> float: - timer = timeit.Timer("func(arg)", globals=locals()) + timer = timeit.Timer(lambda: func(arg)) number, _ = timer.autorange() return min(timer.repeat(number=number)) / number diff --git a/benchmark/requirements.txt b/benchmark/requirements.txt index 29b0ab3a..9e73a2a6 100644 --- a/benchmark/requirements.txt +++ b/benchmark/requirements.txt @@ -6,3 +6,4 @@ pandas==1.4.0 pydantic==1.9.0 typedload==2.15 typical==2.8.0 +pyserde==0.7.0 \ No newline at end of file