[GH-ISSUE #204] [OPTIMISATION] Separate files for computation of time gaps and leader #44

Closed
opened 2026-05-07 00:18:09 +02:00 by BreizhHardware · 1 comment

Originally created by @111110100 on GitHub (Jan 30, 2026).
Original GitHub issue: https://github.com/IAmTomShaw/f1-race-replay/issues/204

This is in reference to a merged PR #85. I noticed computation for time gaps and leader is done separately on two files:

On src/ui_components.py

# A fixed reference speed for all gap calculations (200 km/h = 55.56 m/s)
        REFERENCE_SPEED_MS = 55.56

        def calculate_gap(pos1, pos2):
            # Calculate gap between two positions consistently
            raw_dist = abs(pos1 - pos2)
            dist = raw_dist / 10.0  # Convert to meters
            time = dist / REFERENCE_SPEED_MS
            return dist, time

        if lb and hasattr(lb, "entries") and lb.entries:
            try:
                idx = next(i for i, e in enumerate(lb.entries) if e[0] == code)

                if idx > 0:  # Car Ahead
                    code_ahead = lb.entries[idx - 1][0]
                    curr_pos = lb.entries[idx][3]
                    ahead_pos = lb.entries[idx - 1][3]

                    dist, time = calculate_gap(curr_pos, ahead_pos)
                    gap_ahead = f"Ahead ({code_ahead}): +{time:.2f}s ({dist:.1f}m)"

                if idx < len(lb.entries) - 1:  # Car Behind
                    code_behind = lb.entries[idx + 1][0]
                    curr_pos = lb.entries[idx][3]
                    behind_pos = lb.entries[idx + 1][3]

                    dist, time = calculate_gap(curr_pos, behind_pos)
                    gap_behind = f"Behind ({code_behind}): -{time:.2f}s ({dist:.1f}m)"

            except (StopIteration, IndexError):
                pass

and src/interfaces/race_replay.py

        # A fixed reference speed for all gap calculations (200 km/h = 55.56 m/s)
        REFERENCE_SPEED_MS = 55.56
        leaderboard_gaps = {}
        leaderboard_neighbor_gaps = {}

        leader_progress_val = driver_list[0][3] if driver_list else None

        if driver_list and leader_progress_val is not None:
            # precompute gaps to leader (time) and interval gaps (dist+time)
            for idx, (code, _, pos, progress_m) in enumerate(driver_list):
                try:
                    raw_to_leader = abs(leader_progress_val - (progress_m or 0.0))
                    dist_to_leader = raw_to_leader / 10.0
                    time_to_leader = dist_to_leader / REFERENCE_SPEED_MS
                    leaderboard_gaps[code] = 0.0 if idx == 0 else time_to_leader
                except Exception:
                    leaderboard_gaps[code] = None

                ahead_info = None
                try:
                    if idx > 0:
                        code_ahead, _, _, progress_ahead = driver_list[idx - 1]
                        raw = abs((progress_m or 0.0) - (progress_ahead or 0.0))
                        dist_m = raw / 10.0
                        time_s = dist_m / REFERENCE_SPEED_MS
                        ahead_info = (code_ahead, dist_m, time_s)
                except Exception:
                    ahead_info = None

                leaderboard_neighbor_gaps[code] = {"ahead": ahead_info}

I think that it can optimised by doing the computation on one file, one loop and check if the computation being performed is either vs the leader or between drivers. For reference, please see this commit that's shorter that's part of PR #197.

Originally created by @111110100 on GitHub (Jan 30, 2026). Original GitHub issue: https://github.com/IAmTomShaw/f1-race-replay/issues/204 This is in reference to a merged PR #85. I noticed computation for time gaps and leader is done separately on two files: On [src/ui_components.py](https://github.com/IAmTomShaw/f1-race-replay/blob/4cfe40f62becbcf498f7f093a689e35e45a34202/src/ui_components.py#L856) ```python # A fixed reference speed for all gap calculations (200 km/h = 55.56 m/s) REFERENCE_SPEED_MS = 55.56 def calculate_gap(pos1, pos2): # Calculate gap between two positions consistently raw_dist = abs(pos1 - pos2) dist = raw_dist / 10.0 # Convert to meters time = dist / REFERENCE_SPEED_MS return dist, time if lb and hasattr(lb, "entries") and lb.entries: try: idx = next(i for i, e in enumerate(lb.entries) if e[0] == code) if idx > 0: # Car Ahead code_ahead = lb.entries[idx - 1][0] curr_pos = lb.entries[idx][3] ahead_pos = lb.entries[idx - 1][3] dist, time = calculate_gap(curr_pos, ahead_pos) gap_ahead = f"Ahead ({code_ahead}): +{time:.2f}s ({dist:.1f}m)" if idx < len(lb.entries) - 1: # Car Behind code_behind = lb.entries[idx + 1][0] curr_pos = lb.entries[idx][3] behind_pos = lb.entries[idx + 1][3] dist, time = calculate_gap(curr_pos, behind_pos) gap_behind = f"Behind ({code_behind}): -{time:.2f}s ({dist:.1f}m)" except (StopIteration, IndexError): pass ``` and [src/interfaces/race_replay.py](https://github.com/IAmTomShaw/f1-race-replay/blob/4cfe40f62becbcf498f7f093a689e35e45a34202/src/interfaces/race_replay.py#L529) ```python # A fixed reference speed for all gap calculations (200 km/h = 55.56 m/s) REFERENCE_SPEED_MS = 55.56 leaderboard_gaps = {} leaderboard_neighbor_gaps = {} leader_progress_val = driver_list[0][3] if driver_list else None if driver_list and leader_progress_val is not None: # precompute gaps to leader (time) and interval gaps (dist+time) for idx, (code, _, pos, progress_m) in enumerate(driver_list): try: raw_to_leader = abs(leader_progress_val - (progress_m or 0.0)) dist_to_leader = raw_to_leader / 10.0 time_to_leader = dist_to_leader / REFERENCE_SPEED_MS leaderboard_gaps[code] = 0.0 if idx == 0 else time_to_leader except Exception: leaderboard_gaps[code] = None ahead_info = None try: if idx > 0: code_ahead, _, _, progress_ahead = driver_list[idx - 1] raw = abs((progress_m or 0.0) - (progress_ahead or 0.0)) dist_m = raw / 10.0 time_s = dist_m / REFERENCE_SPEED_MS ahead_info = (code_ahead, dist_m, time_s) except Exception: ahead_info = None leaderboard_neighbor_gaps[code] = {"ahead": ahead_info} ``` I think that it can optimised by doing the computation on one file, one loop and check if the computation being performed is either vs the leader or between drivers. For reference, please see [this commit that's shorter](https://github.com/IAmTomShaw/f1-race-replay/pull/197/changes/81b33de52df8fc93e533829543b967f5eb56a531#diff-66a4e63622ae8dda877fbe0845125c7159b0cad890663b8941d932949ffed8c4R373) that's part of PR #197.
Author
Owner

@111110100 commented on GitHub (Feb 6, 2026):

  • #215 merged to main, therefore closing
<!-- gh-comment-id:3857106826 --> @111110100 commented on GitHub (Feb 6, 2026): * #215 merged to main, therefore closing
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/f1-race-replay#44
No description provided.