tracinginsights's picture
download
raw
3.15 kB
#!/usr/bin/env python3
"""Profile the per-lap telemetry pipeline used by Rp.py / R.py.
Times each sub-step of FastF1's Lap.get_telemetry() for a sample of laps:
get_pos_data / get_car_data (slices)
add_driver_ahead (incl. calculate_driver_ahead internals)
add_distance + add_relative_distance
merge_channels(car vs drv_ahead)
merge_channels(pos vs car)
slice_by_lap(interpolate_edges=True)
"""
import logging
import os
import sys
import time
import fastf1
import numpy as np
import pandas as pd
logging.basicConfig(level=logging.ERROR)
logging.getLogger("fastf1").setLevel(logging.ERROR)
def t_per_driver(fn):
v = 0.0
n = 0
for _ in range(3):
t0 = time.perf_counter()
fn()
v += time.perf_counter() - t0
n += 1
return v / n
def main():
year = 2026
os.makedirs("cache", exist_ok=True)
fastf1.Cache.enable_cache("cache")
sessions = fastf1.get_session(year, "Austrian Grand Prix", "Race")
sessions.load(telemetry=True, weather=False, messages=False)
laps = sessions.laps
drivers = sorted(laps["Driver"].dropna().unique())
tot = 0
n_laps = 0
for drv in drivers[:8]:
drv_laps = laps.pick_drivers(drv)
for lap_no in drv_laps["LapNumber"].tolist()[:8]:
sel = drv_laps[drv_laps["LapNumber"] == lap_no]
if sel.empty:
continue
t0 = time.perf_counter()
n_laps += 1
t_slice = t_per_driver(lambda: None)
t0 = time.perf_counter()
pos = sel.get_pos_data(pad=1, pad_side="both")
t_pos = time.perf_counter() - t0
t0 = time.perf_counter()
car = sel.get_car_data(pad=1, pad_side="both")
t_car = time.perf_counter() - t0
# driver ahead
t0 = time.perf_counter()
t_inner = 0.0
drv_ahead = car.iloc[1:-1].add_driver_ahead().loc[:, ("DriverAhead", "DistanceToDriverAhead", "Date", "Time", "SessionTime")]
t_da = time.perf_counter() - t0
t0 = time.perf_counter()
car2 = car.add_distance().add_relative_distance()
t_dist = time.perf_counter() - t0
t0 = time.perf_counter()
car3 = car2.merge_channels(drv_ahead, frequency=None)
t_m1 = time.perf_counter() - t0
t0 = time.perf_counter()
merged = pos.merge_channels(car3, frequency=None)
t_m2 = time.perf_counter() - t0
t0 = time.perf_counter()
merged2 = merged.slice_by_lap(sel, interpolate_edges=True)
t_slc = time.perf_counter() - t0
lap_t = t_pos + t_car + t_da + t_dist + t_m1 + t_m2 + t_slc
tot += lap_t
print(f"{drv} lap {lap_no}: pos={t_pos*1e3:.1f}ms car={t_car*1e3:.1f}ms "
f"driver_ahead={t_da*1e3:.1f}ms dist={t_dist*1e3:.1f}ms "
f"merge1={t_m1*1e3:.1f}ms merge2={t_m2*1e3:.1f}ms slice={t_slc*1e3:.1f}ms "
f"TOTAL={lap_t*1e3:.1f}ms")
print(f"\n{n_laps} sampled; avg per lap = {tot/n_laps*1e3:.1f}ms")
if __name__ == "__main__":
main()

Xet Storage Details

Size:
3.15 kB
·
Xet hash:
13b2f7a3dbccb2fc820f56397ca6e6bd046ff16861063583654a996d3085c2ca

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.