diff --git a/pyperformance/data-files/benchmarks/MANIFEST b/pyperformance/data-files/benchmarks/MANIFEST index 868999c7..9e35b585 100644 --- a/pyperformance/data-files/benchmarks/MANIFEST +++ b/pyperformance/data-files/benchmarks/MANIFEST @@ -2,6 +2,7 @@ name metafile 2to3 +async_generators async_tree async_tree_cpu_io_mixed async_tree_io diff --git a/pyperformance/data-files/benchmarks/bm_async_generators/pyproject.toml b/pyperformance/data-files/benchmarks/bm_async_generators/pyproject.toml new file mode 100644 index 00000000..07d3aa05 --- /dev/null +++ b/pyperformance/data-files/benchmarks/bm_async_generators/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "pyperformance_bm_async_generators" +requires-python = ">=3.8" +dependencies = ["pyperf"] +urls = {repository = "https://github.com/python/pyperformance"} +dynamic = ["version"] + +[tool.pyperformance] +name = "async_generators" diff --git a/pyperformance/data-files/benchmarks/bm_async_generators/run_benchmark.py b/pyperformance/data-files/benchmarks/bm_async_generators/run_benchmark.py new file mode 100644 index 00000000..24f959f1 --- /dev/null +++ b/pyperformance/data-files/benchmarks/bm_async_generators/run_benchmark.py @@ -0,0 +1,45 @@ +""" +Benchmark recursive async generators implemented in python +by traversing a binary tree. + +Author: Kumar Aditya +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator + +import pyperf + + +class Tree: + def __init__(self, left: Tree | None, value: int, right: Tree | None) -> None: + self.left = left + self.value = value + self.right = right + + async def __aiter__(self) -> AsyncIterator[int]: + if self.left: + async for i in self.left: + yield i + yield self.value + if self.right: + async for i in self.right: + yield i + + +def tree(input: range) -> Tree | None: + n = len(input) + if n == 0: + return None + i = n // 2 + return Tree(tree(input[:i]), input[i], tree(input[i + 1:])) + +async def bench_async_generators() -> None: + async for _ in tree(range(100000)): + pass + +if __name__ == "__main__": + runner = pyperf.Runner() + runner.metadata['description'] = "Benchmark async generators" + runner.bench_async_func('async_generators', bench_async_generators)