From c95912fc2855173da013838d2d60e9c4307bebd3 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Sun, 15 May 2022 20:53:43 +0200 Subject: [PATCH 1/6] Add benchmark for deepcopy --- doc/benchmarks.rst | 5 +++ pyperformance/data-files/benchmarks/MANIFEST | 1 + .../benchmarks/bm_deepcopy/pyproject.toml | 9 ++++ .../benchmarks/bm_deepcopy/run_benchmark.py | 42 +++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 pyperformance/data-files/benchmarks/bm_deepcopy/pyproject.toml create mode 100644 pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py diff --git a/doc/benchmarks.rst b/doc/benchmarks.rst index 09c7abc4..be9456b0 100644 --- a/doc/benchmarks.rst +++ b/doc/benchmarks.rst @@ -108,6 +108,11 @@ See `pyaes `_: A pure-Python implementation of the AES block cipher algorithm and the common modes of operation (CBC, CFB, CTR, ECB and OFB). +deepcopy +-------- + +benchmark the pytython `copy.deepcopy` method. The `deepcopy` method is +performed on a nestest dictionary and a dataclass. deltablue --------- diff --git a/pyperformance/data-files/benchmarks/MANIFEST b/pyperformance/data-files/benchmarks/MANIFEST index a52cb7a1..f2338845 100644 --- a/pyperformance/data-files/benchmarks/MANIFEST +++ b/pyperformance/data-files/benchmarks/MANIFEST @@ -5,6 +5,7 @@ name metafile chameleon chaos crypto_pyaes +deepcopy deltablue django_template dulwich_log diff --git a/pyperformance/data-files/benchmarks/bm_deepcopy/pyproject.toml b/pyperformance/data-files/benchmarks/bm_deepcopy/pyproject.toml new file mode 100644 index 00000000..5da44754 --- /dev/null +++ b/pyperformance/data-files/benchmarks/bm_deepcopy/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "pyperformance_bm_deepcopy" +requires-python = ">=3.8" +dependencies = ["pyperf"] +urls = {repository = "https://github.com/python/pyperformance"} +dynamic = ["version"] + +[tool.pyperformance] +name = "deepcopy" diff --git a/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py new file mode 100644 index 00000000..bc408857 --- /dev/null +++ b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py @@ -0,0 +1,42 @@ +""" +Benchmark to measure performance of the python builtin method copy.deepcopy + +Performance is tested on a nested dictionary and a dataclass + +Author: Pieter Eendebak + +""" +import copy +import pyperf +from dataclasses import dataclass + +@dataclass +class A: + string : str + lst : list + boolean : bool + + +def benchmark(n): + a={'list': [1,2,3,43], 't': (1,2,3), 'str': 'hello', 'subdict': {'a': True}} + dc=A('hello', [1,2,3], True) + + for ii in range(n): + + for jj in range(60): + _ = copy.deepcopy(a) + + for s in ['red', 'blue', 'green']: + dc.string = s + for ii in range(10): + dc.lst[0] = ii + for b in [True, False]: + dc.boolean=b + _ = copy.deepcopy(dc) + + +if __name__ == "__main__": + runner = pyperf.Runner() + runner.metadata['description'] = "deepcopy benchmark" + + runner.bench_func('deepcopy', benchmark, 200) From 9a96b758a32c1a145f21fe3e71ed97e92386b59a Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Sun, 15 May 2022 21:02:19 +0200 Subject: [PATCH 2/6] fix typo --- doc/benchmarks.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/benchmarks.rst b/doc/benchmarks.rst index be9456b0..7413c41f 100644 --- a/doc/benchmarks.rst +++ b/doc/benchmarks.rst @@ -111,8 +111,8 @@ CTR, ECB and OFB). deepcopy -------- -benchmark the pytython `copy.deepcopy` method. The `deepcopy` method is -performed on a nestest dictionary and a dataclass. +Benchmark the Python `copy.deepcopy` method. The `deepcopy` method is +performed on a nested dictionary and a dataclass. deltablue --------- From 1c432b5cf181022966382380a621447dc58bfd7e Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Tue, 24 May 2022 20:35:09 +0200 Subject: [PATCH 3/6] Update pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py Co-authored-by: Eric Snow --- .../data-files/benchmarks/bm_deepcopy/run_benchmark.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py index bc408857..3bdfb28b 100644 --- a/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py +++ b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py @@ -18,20 +18,17 @@ class A: def benchmark(n): - a={'list': [1,2,3,43], 't': (1,2,3), 'str': 'hello', 'subdict': {'a': True}} - dc=A('hello', [1,2,3], True) - + a = {'list': [1,2,3,43], 't': (1,2,3), 'str': 'hello', 'subdict': {'a': True}} + dc = A('hello', [1,2,3], True) for ii in range(n): - for jj in range(60): _ = copy.deepcopy(a) - for s in ['red', 'blue', 'green']: dc.string = s for ii in range(10): dc.lst[0] = ii for b in [True, False]: - dc.boolean=b + dc.boolean = b _ = copy.deepcopy(dc) From c78237aaf020a8730276e1ded9f96241efdacc85 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Tue, 24 May 2022 20:35:20 +0200 Subject: [PATCH 4/6] Update pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py Co-authored-by: Eric Snow --- .../data-files/benchmarks/bm_deepcopy/run_benchmark.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py index 3bdfb28b..b22535a3 100644 --- a/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py +++ b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py @@ -25,8 +25,8 @@ def benchmark(n): _ = copy.deepcopy(a) for s in ['red', 'blue', 'green']: dc.string = s - for ii in range(10): - dc.lst[0] = ii + for kk in range(10): + dc.lst[0] = kk for b in [True, False]: dc.boolean = b _ = copy.deepcopy(dc) From a7776046cafd6135321be0518751f44ff483266c Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Tue, 24 May 2022 22:05:18 +0200 Subject: [PATCH 5/6] address review comments --- .../benchmarks/bm_deepcopy/run_benchmark.py | 66 ++++++++++++++++--- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py index b22535a3..075ef371 100644 --- a/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py +++ b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py @@ -10,30 +10,76 @@ import pyperf from dataclasses import dataclass + @dataclass class A: - string : str - lst : list - boolean : bool - + string: str + lst: list + boolean: bool + + +def benchmark_reduce(n): + """ Benchmark where the __reduce__ functionality is used """ + class C(object): + def __init__(self): + self.a = 1 + self.b = 2 + + def __reduce__(self): + return (C, (), self.__dict__) + + def __setstate__(self, state): + self.__dict__.update(state) + c = C() + + t0 = pyperf.perf_counter() + for ii in range(n): + _ = copy.deepcopy(c) + dt = pyperf.perf_counter() - t0 + return dt + + +def benchmark_memo(n): + """ Benchmark where the memo functionality is used """ + A = [1] * 100 + data = {'a': (A, A, A), 'b': [A] * 100} + + t0 = pyperf.perf_counter() + for ii in range(n): + _ = copy.deepcopy(data) + dt = pyperf.perf_counter() - t0 + return dt + def benchmark(n): - a = {'list': [1,2,3,43], 't': (1,2,3), 'str': 'hello', 'subdict': {'a': True}} - dc = A('hello', [1,2,3], True) + """ Benchmark on some standard data types """ + a = { + 'list': [1, 2, 3, 43], + 't': (1 ,2, 3), + 'str': 'hello', + 'subdict': {'a': True} + } + dc = A('hello', [1, 2, 3], True) + + t0 = pyperf.perf_counter() for ii in range(n): - for jj in range(60): + for jj in range(30): _ = copy.deepcopy(a) for s in ['red', 'blue', 'green']: dc.string = s - for kk in range(10): + for kk in range(5): dc.lst[0] = kk for b in [True, False]: dc.boolean = b _ = copy.deepcopy(dc) - + dt = pyperf.perf_counter() - t0 + return dt + if __name__ == "__main__": runner = pyperf.Runner() runner.metadata['description'] = "deepcopy benchmark" - runner.bench_func('deepcopy', benchmark, 200) + runner.bench_time_func('deepcopy', benchmark) + runner.bench_time_func('deepcopy_reduce', benchmark_reduce) + runner.bench_time_func('deepcopy_memo', benchmark_memo) From 5e9c47dbe5cf91d91f44a4cbdfe0d8b9d9b1e6ca Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Tue, 7 Jun 2022 09:22:49 +0200 Subject: [PATCH 6/6] Update pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py Co-authored-by: Eric Snow --- .../data-files/benchmarks/bm_deepcopy/run_benchmark.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py index 075ef371..c706a306 100644 --- a/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py +++ b/pyperformance/data-files/benchmarks/bm_deepcopy/run_benchmark.py @@ -61,18 +61,21 @@ def benchmark(n): } dc = A('hello', [1, 2, 3], True) - t0 = pyperf.perf_counter() + dt = 0 for ii in range(n): for jj in range(30): + t0 = pyperf.perf_counter() _ = copy.deepcopy(a) + dt += pyperf.perf_counter() - t0 for s in ['red', 'blue', 'green']: dc.string = s for kk in range(5): dc.lst[0] = kk for b in [True, False]: dc.boolean = b + t0 = pyperf.perf_counter() _ = copy.deepcopy(dc) - dt = pyperf.perf_counter() - t0 + dt += pyperf.perf_counter() - t0 return dt