66import random
77import timeit
88from datetime import datetime , timedelta
9- from typing import Any , TypeVar
9+ from typing import Any , Dict , TypeVar
1010
1111import numpy as np
1212
13+ from frequenz .sdk .timeseries import Sample
1314from frequenz .sdk .timeseries ._ringbuffer import OrderedRingBuffer
1415
1516MINUTES_IN_A_DAY = 24 * 60
1920T = TypeVar ("T" )
2021
2122
22- def fill_buffer (
23- days : int , buffer : OrderedRingBuffer [T , Any ], element_type : type
24- ) -> None :
23+ def fill_buffer (days : int , buffer : OrderedRingBuffer [Any ]) -> None :
2524 """Fill the given buffer up to the given amount of days, one sample per minute."""
2625 random .seed (0 )
2726 basetime = datetime (2022 , 1 , 1 )
@@ -31,14 +30,12 @@ def fill_buffer(
3130 # Push in random order
3231 for i in random .sample (range (MINUTES_IN_A_DAY ), MINUTES_IN_A_DAY ):
3332 buffer .update (
34- basetime + timedelta (days = day , minutes = i , seconds = i % 3 ),
35- element_type (i ),
33+ Sample (basetime + timedelta (days = day , minutes = i , seconds = i % 3 ))
3634 )
3735
3836
39- def test_days (days : int , buffer : OrderedRingBuffer [T , Any ]) -> None :
37+ def test_days (days : int , buffer : OrderedRingBuffer [Any ]) -> None :
4038 """Gets the data for each of the 29 days."""
41-
4239 basetime = datetime (2022 , 1 , 1 )
4340
4441 for day in range (days ):
@@ -48,13 +45,12 @@ def test_days(days: int, buffer: OrderedRingBuffer[T, Any]) -> None:
4845 )
4946
5047
51- def test_slices (days : int , buffer : OrderedRingBuffer [T , Any ], median : bool ) -> None :
48+ def test_slices (days : int , buffer : OrderedRingBuffer [Any ], median : bool ) -> None :
5249 """Benchmark slicing.
5350
5451 Takes a buffer, fills it up and then excessively gets
5552 the data for each day to calculate the average/median.
5653 """
57-
5854 basetime = datetime (2022 , 1 , 1 )
5955
6056 total = 0.0
@@ -71,18 +67,17 @@ def test_slices(days: int, buffer: OrderedRingBuffer[T, Any], median: bool) -> N
7167 total += float (np .average (minutes ))
7268
7369
74- def test_29_days_list (num_runs : int ) -> dict :
70+ def test_29_days_list (num_runs : int ) -> Dict [ str , float ] :
7571 """Run the 29 day test on the list backend."""
76-
7772 days = 29
7873 buffer = OrderedRingBuffer ([0 ] * MINUTES_IN_29_DAYS , timedelta (minutes = 1 ))
7974
80- fill_time = timeit .Timer (lambda : fill_buffer (days , buffer , int )).timeit (number = 1 )
75+ fill_time = timeit .Timer (lambda : fill_buffer (days , buffer )).timeit (number = 1 )
8176 test_time = timeit .Timer (lambda : test_days (days , buffer )).timeit (number = num_runs )
8277 return {"fill" : fill_time , "test" : test_time }
8378
8479
85- def test_29_days_array (num_runs : int ) -> dict :
80+ def test_29_days_array (num_runs : int ) -> Dict [ str , float ] :
8681 """Run the 29 day test on the array backend."""
8782 days = 29
8883 buffer = OrderedRingBuffer (
@@ -92,17 +87,17 @@ def test_29_days_array(num_runs: int) -> dict:
9287 timedelta (minutes = 1 ),
9388 )
9489
95- fill_time = timeit .Timer (lambda : fill_buffer (days , buffer , int )).timeit (number = 1 )
90+ fill_time = timeit .Timer (lambda : fill_buffer (days , buffer )).timeit (number = 1 )
9691 test_time = timeit .Timer (lambda : test_days (days , buffer )).timeit (number = num_runs )
9792 return {"fill" : fill_time , "test" : test_time }
9893
9994
100- def test_29_days_slicing_list (num_runs : int ) -> dict :
95+ def test_29_days_slicing_list (num_runs : int ) -> Dict [ str , float ] :
10196 """Run slicing tests on list backend."""
10297 days = 29
10398 buffer = OrderedRingBuffer ([0 ] * MINUTES_IN_29_DAYS , timedelta (minutes = 1 ))
10499
105- fill_time = timeit .Timer (lambda : fill_buffer (days , buffer , int )).timeit (number = 1 )
100+ fill_time = timeit .Timer (lambda : fill_buffer (days , buffer )).timeit (number = 1 )
106101 median_test_time = timeit .Timer (
107102 lambda : test_slices (days , buffer , median = True )
108103 ).timeit (number = num_runs )
@@ -113,7 +108,7 @@ def test_29_days_slicing_list(num_runs: int) -> dict:
113108 return {"fill" : fill_time , "median" : median_test_time , "avg" : avg_test_time }
114109
115110
116- def test_29_days_slicing_array (num_runs : int ) -> dict :
111+ def test_29_days_slicing_array (num_runs : int ) -> Dict [ str , float ] :
117112 """Run slicing tests on array backend."""
118113 days = 29
119114 buffer = OrderedRingBuffer (
@@ -123,7 +118,7 @@ def test_29_days_slicing_array(num_runs: int) -> dict:
123118 timedelta (minutes = 1 ),
124119 )
125120
126- fill_time = timeit .Timer (lambda : fill_buffer (days , buffer , int )).timeit (number = 1 )
121+ fill_time = timeit .Timer (lambda : fill_buffer (days , buffer )).timeit (number = 1 )
127122 median_test_time = timeit .Timer (
128123 lambda : test_slices (days , buffer , median = True )
129124 ).timeit (number = num_runs )
@@ -139,31 +134,31 @@ def main() -> None:
139134
140135 Result of previous run:
141136
142- Date: Mi 1. Feb 17:15:02 CET 2023
137+ Date: Mi 1. Feb 17:19:51 CET 2023
143138 Result:
144139
145140 =====================
146141 Array: ..filling
147142 List: ..filling
148143 Time to fill 29 days with data:
149- Array: 7.190492740017362 seconds
150- List: 7.209744154009968 seconds
151- Diff: -0.019251413992606103
144+ Array: 7.214875044999644 seconds
145+ List: 7.174421657982748 seconds
146+ Diff: 0.04045338701689616
152147 Day-Slices into 29 days with data:
153- Array: 0.0001254317001439631 seconds
154- List: 0.00017958255193661898 seconds
155- Diff: -5.4150851792655874e -05
148+ Array: 0.0001304591482039541 seconds
149+ List: 0.00019963659869972616 seconds
150+ Diff: -6.917745049577205e -05
156151 =====================
157152 Array: ..filling
158153 List: ..filling
159154 Avg of windows of 29 days and running average & mean on every day:
160- Array: 0.0007975498505402356 seconds
161- List: 0.0042349924508016555 seconds
162- Diff: -0.0034374426002614198
155+ Array: 0.0007829780981410295 seconds
156+ List: 0.0042931242496706545 seconds
157+ Diff: -0.0035101461515296252
163158 Median of windows of 29 days and running average & mean on every day:
164- Array: 0.0021774103515781462 seconds
165- List: 0.004992740901070647 seconds
166- Diff: -0.0028153305494925005
159+ Array: 0.0021195551002165304 seconds
160+ List: 0.00501448459981475 seconds
161+ Diff: -0.00289492949959822
167162 """
168163 num_runs = 20
169164
@@ -208,7 +203,8 @@ def main() -> None:
208203 "Median of windows of 29 days and running average & mean on every day:\n \t "
209204 + f"Array: { slicing_array_times ['median' ]/ num_runs } seconds\n \t "
210205 + f"List: { slicing_list_times ['median' ]/ num_runs } seconds\n \t "
211- + f"Diff: { slicing_array_times ['median' ]/ num_runs - slicing_list_times ['median' ]/ num_runs } "
206+ + "Diff: "
207+ + f"{ slicing_array_times ['median' ]/ num_runs - slicing_list_times ['median' ]/ num_runs } "
212208 )
213209
214210
0 commit comments