import abc
import time
from typing import Any
[docs]class BaseGenerator(metaclass=abc.ABCMeta):
DataType = Any
[docs] @abc.abstractmethod
def generate(self, N: int) -> Any:
raise NotImplementedError("generate")
[docs]class GenTest:
def __init__(self, N_max):
self.N_max = N_max
self.N_gen = 0
self.N_total = 0
self.eff = 0.9
[docs] def generate(self, N):
self.N_gen = 0
self.N_total = 0
N_progress = 50
start_time = time.perf_counter()
while self.N_gen < N:
test_N = min(int((N - self.N_gen) / self.eff * 1.1), self.N_max)
self.N_total += test_N
yield test_N
progress = self.N_gen / N + 1e-5
finsh = "▓" * int(progress * N_progress)
need_do = "-" * (N_progress - int(progress * N_progress) - 1)
now = time.perf_counter() - start_time
print(
"\r{:^3.1f}%[{}>{}] {:.2f}/{:.2f}s eff: {:.6f}% ".format(
progress * 100,
finsh,
need_do,
now,
now / progress,
self.eff * 100,
),
end="",
)
self.eff = (self.N_gen + 1) / (self.N_total + 1) # avoid zero
end_time = time.perf_counter() - start_time
print(
"\r{:^3.1f}%[{}] {:.2f}/{:.2f}s eff: {:.6f}% ".format(
100, "▓" * N_progress, end_time, end_time, self.eff * 100
)
)
[docs] def add_gen(self, n_gen):
# print("add gen")
self.N_gen = self.N_gen + n_gen
[docs] def set_gen(self, n_gen):
# print("set gen")
self.N_gen = n_gen