优化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
相关产品推荐
相关产品推荐

