feat(python): implement python bindings for all components and solvers
This commit is contained in:
98
bindings/python/tests/test_benchmark.py
Normal file
98
bindings/python/tests/test_benchmark.py
Normal file
@@ -0,0 +1,98 @@
|
||||
"""Entropyk — Performance Benchmark Tests.
|
||||
|
||||
Tests that measure Python→Rust call overhead and verify performance.
|
||||
These are not unit tests — they measure timing and should be run with
|
||||
``pytest -s`` for visible output.
|
||||
"""
|
||||
|
||||
import time
|
||||
import pytest
|
||||
import entropyk
|
||||
|
||||
|
||||
class TestConstructorOverhead:
|
||||
"""Benchmark component construction overhead."""
|
||||
|
||||
def test_1000_compressor_constructions(self):
|
||||
"""Constructing 1000 Compressors should be very fast (< 100 ms)."""
|
||||
start = time.perf_counter()
|
||||
for _ in range(1000):
|
||||
entropyk.Compressor()
|
||||
elapsed = time.perf_counter() - start
|
||||
assert elapsed < 0.1, f"1000 Compressor constructions took {elapsed:.3f}s"
|
||||
|
||||
def test_1000_pressure_constructions(self):
|
||||
"""Constructing 1000 Pressure objects should be very fast."""
|
||||
start = time.perf_counter()
|
||||
for _ in range(1000):
|
||||
entropyk.Pressure(bar=1.0)
|
||||
elapsed = time.perf_counter() - start
|
||||
assert elapsed < 0.1, f"1000 Pressure constructions took {elapsed:.3f}s"
|
||||
|
||||
def test_1000_temperature_constructions(self):
|
||||
"""Constructing 1000 Temperature objects should be very fast."""
|
||||
start = time.perf_counter()
|
||||
for _ in range(1000):
|
||||
entropyk.Temperature(celsius=25.0)
|
||||
elapsed = time.perf_counter() - start
|
||||
assert elapsed < 0.1, f"1000 Temperature constructions took {elapsed:.3f}s"
|
||||
|
||||
|
||||
class TestConversionOverhead:
|
||||
"""Benchmark unit conversion overhead."""
|
||||
|
||||
def test_1000_pressure_conversions(self):
|
||||
"""Unit conversions should add negligible overhead."""
|
||||
p = entropyk.Pressure(bar=1.0)
|
||||
start = time.perf_counter()
|
||||
for _ in range(1000):
|
||||
_ = p.to_bar()
|
||||
_ = p.to_pascals()
|
||||
_ = p.to_kpa()
|
||||
elapsed = time.perf_counter() - start
|
||||
assert elapsed < 0.1, f"3000 pressure conversions took {elapsed:.3f}s"
|
||||
|
||||
def test_1000_temperature_conversions(self):
|
||||
"""Temperature conversions should be fast."""
|
||||
t = entropyk.Temperature(celsius=25.0)
|
||||
start = time.perf_counter()
|
||||
for _ in range(1000):
|
||||
_ = t.to_celsius()
|
||||
_ = t.to_kelvin()
|
||||
_ = t.to_fahrenheit()
|
||||
elapsed = time.perf_counter() - start
|
||||
assert elapsed < 0.1, f"3000 temperature conversions took {elapsed:.3f}s"
|
||||
|
||||
|
||||
class TestArithmeticOverhead:
|
||||
"""Benchmark arithmetic operation overhead."""
|
||||
|
||||
def test_1000_additions(self):
|
||||
"""1000 pressure additions should be fast."""
|
||||
p1 = entropyk.Pressure(pa=101325.0)
|
||||
p2 = entropyk.Pressure(pa=50000.0)
|
||||
start = time.perf_counter()
|
||||
for _ in range(1000):
|
||||
_ = p1 + p2
|
||||
elapsed = time.perf_counter() - start
|
||||
assert elapsed < 0.1, f"1000 additions took {elapsed:.3f}s"
|
||||
|
||||
|
||||
class TestSystemBuildOverhead:
|
||||
"""Benchmark system construction overhead."""
|
||||
|
||||
def test_100_system_builds(self):
|
||||
"""Building 100 simple systems (4 components + 4 edges) should be fast."""
|
||||
start = time.perf_counter()
|
||||
for _ in range(100):
|
||||
system = entropyk.System()
|
||||
c = system.add_component(entropyk.Compressor())
|
||||
d = system.add_component(entropyk.Condenser())
|
||||
e = system.add_component(entropyk.ExpansionValve())
|
||||
v = system.add_component(entropyk.Evaporator())
|
||||
system.add_edge(c, d)
|
||||
system.add_edge(d, e)
|
||||
system.add_edge(e, v)
|
||||
system.add_edge(v, c)
|
||||
elapsed = time.perf_counter() - start
|
||||
assert elapsed < 1.0, f"100 system builds took {elapsed:.3f}s"
|
||||
Reference in New Issue
Block a user