Your question is Refactor for Performance. Take a moment with it on the right.
Talk me through your thinking if you like. When you're confident, submit your answer and I'll grade it like a real screen (7/10 or better passes).
FXC Intelligence tracks foreign-exchange pricing across dozens of currency corridors. An analyst needs the USD-equivalent cross rate for every quoted pair, computed from a list of raw ticks pulled from a market-data feed. The function below works, but a data engineer flagged it as the slowest step in the nightly pricing job by a wide margin.
def build_cross_rates(ticks, base_ccy):
result = []
for pair in ticks:
match = None
for other in ticks:
if other["quote_ccy"] == pair["base_ccy"] and other["base_ccy"] == base_ccy:
match = other
if match is None:
continue
base_rate = float(str(match["rate"]))
pair_rate = float(str(pair["rate"]))
cross = base_rate * pair_rate
result = result + [{"pair": pair["base_ccy"] + pair["quote_ccy"], "cross_rate": cross}]
result = sorted(result, key=lambda r: r["pair"])
return result
Explain what makes this slow at scale, and describe how you would change it to run in roughly linear time on a feed with tens of thousands of ticks.