You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化Python中Airlabs API多循环迭代的执行速度

优化机场经纬度匹配效率的方案

你的代码运行缓慢的核心问题有三个:

  • 每次调用get_airport_cordinates都重复请求机场API,完全是资源浪费
  • 用线性遍历匹配ICAO码,数据量大时时间复杂度O(n),效率极低
  • 重复执行坐标查询和距离计算,做了大量无用功

下面是针对性的优化方案:

1. 预加载机场数据并构建字典映射

把机场数据一次性加载完成,然后用ICAO码作为键、经纬度作为值构建字典。这样查询坐标的时间复杂度直接降到O(1),彻底解决遍历耗时问题。

修改初始化和坐标查询代码:

# 一次性加载航班和机场数据
self.flights_list = ApiConnector('airlabs', 'flights', 'dep_icao,arr_icao,flight_number,flag,aircraft_icao').get_data_from_api()
# 仅请求一次机场API,避免重复调用
airports_raw_data = ApiConnector('airlabs', 'airports', 'icao_code,name,lat,lng').get_data_from_api()
# 构建ICAO到经纬度的映射字典,提前过滤无效数据
self.airport_coords_map = {
    airport['icao_code']: (airport['lat'], airport['lng'])
    for airport in airports_raw_data
    if all(key in airport for key in ['icao_code', 'lat', 'lng'])
}

# 重写坐标查询方法,直接查字典
def get_airport_cordinates(self, icao_code):
    # 返回(None, None)表示未找到对应机场
    return self.airport_coords_map.get(icao_code, (None, None))

2. 避免重复计算,复用中间结果

遍历航班时,只获取一次起终点坐标、只计算一次距离,然后把结果复用到距离和碳排放的打印中,减少重复操作:

def list_all_flights(self):
    # 只实例化一次Emissions对象,避免重复创建开销
    calc = Emissions()
    # 注意修正原代码的拼写错误:get_data_from.api() → get_data_from_api()
    for flight in self.flights_list.get_data_from_api():
        dep_icao = flight.get('dep_icao')
        arr_icao = flight.get('arr_icao')
        
        if dep_icao and arr_icao:
            # 仅查询一次起终点坐标
            dep_coords = self.get_airport_cordinates(dep_icao)
            arr_coords = self.get_airport_cordinates(arr_icao)
            
            # 确保坐标有效再计算
            if dep_coords[0] is not None and arr_coords[0] is not None:
                # 仅计算一次飞行距离
                flight_distance = calc.calculate_distance(dep_coords, arr_coords)
                # 批量打印信息
                print(f"航班号:{flight['flight_number']},航空公司:{flight['flag']},机型:{flight['aircraft_icao']},从{dep_icao}飞往{arr_icao}")
                print(f"飞行距离:{flight_distance} km")
                print(f"CO₂排放量:{calc.calculate_co2_emissions(flight_distance)} kg")
            else:
                print(f"航班{flight['flight_number']}的机场坐标缺失:{dep_icao}/{arr_icao}")

3. 额外优化建议

  • 本地缓存机场数据:如果需要多次运行脚本,可以把机场数据保存到本地JSON文件,每次启动先读本地缓存,缓存过期再重新请求API,进一步减少网络开销
  • 数据预处理:提前过滤掉航班列表中没有起终点ICAO的条目,减少无效循环
  • 批量打印:如果打印操作占比高,可以把所有结果收集到列表后一次性打印,减少IO操作耗时

内容的提问来源于stack exchange,提问作者Bloober

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:10:25