from random import choice
from time import perf_counter
import string


def gen_random_string(alphabet, length):
    ans = ''
    for k in range(length):
        ans += choice(alphabet)
    return ans


def f_slow(s):
    ans = 0
    for start in range(len(s)):
        for end in range(start + 1, len(s) + 1):
            L_free = start > 0 and not s[start - 1].isdigit() or start == 0
            R_free = end < len(s) - 1 and not s[end + 1].isdigit() or end == len(s) - 1
            if s[start:end].isdigit() and (L_free or R_free):
                ans += int(s[start:end])
    return ans


def f_fast(s):
    ans = 0
    number = ''
    for ch in s:
        if ch.isdigit():
            number += ch
        else:
            if len(number) > 0:
                ans += int(number)
                number = ''
    return ans + (0 if number == '' else int(number))


alph = string.ascii_uppercase
for L in 10, 20, 30, 50, 100, 1000, 5000, 10000:
    test = gen_random_string(alph, L)
    start = perf_counter()
    slow_ans = f_slow(test)
    slow_res = perf_counter() - start
    start = perf_counter()
    fast_ans = f_fast(test)
    assert slow_ans == fast_ans
    fast_res = perf_counter() - start
    print(f"test length={L}: slow time = {slow_res:.4f}, fast time = {fast_res:.4f}")
    