From: Jérôme Benoit Date: Sat, 30 Aug 2025 23:07:49 +0000 (+0200) Subject: perf(qav3): optimize largest_divisor_to_step() X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=0c94d48d7bff447ddd2e9214770c8fe2a66d888d;p=freqai-strategies.git perf(qav3): optimize largest_divisor_to_step() Signed-off-by: Jérôme Benoit --- diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 63bc76d..d84addf 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -908,23 +908,27 @@ def get_optuna_study_model_parameters( @lru_cache(maxsize=8) -def largest_divisor(integer: int, step: int) -> Optional[int]: +def largest_divisor_to_step(integer: int, step: int) -> Optional[int]: if not isinstance(integer, int) or integer <= 0: raise ValueError("integer must be a positive integer") if not isinstance(step, int) or step <= 0: raise ValueError("step must be a positive integer") - q_start = math.floor(0.5 * step) + 1 - q_end = math.ceil(1.5 * step) - 1 + if step == 1 or integer % step == 0: + return integer - if q_start > q_end: - return None - - for q in range(q_start, q_end + 1): - if integer % q == 0: - return int(integer / q) + best_divisor: Optional[int] = None + max_divisor = int(math.isqrt(integer)) + for i in range(1, max_divisor + 1): + if integer % i != 0: + continue + j = integer // i + if j % step == 0: + return j + if i % step == 0: + best_divisor = i - return None + return best_divisor def soft_extremum(series: pd.Series, alpha: float) -> float: