如何在T-SQL中高效生成站点间距离字符串矩阵(供Python脚本使用)
高效生成站点距离矩阵的Python实现
针对你处理600+站点时用fast_forward游标无法得到结果的问题,我推荐用本地哈希映射+批量构建的方案,这个方法能把时间复杂度控制在可控范围,而且完全规避数据库游标的IO瓶颈。
核心思路
- 先把所有站点距离数据加载到本地,用一个双向字典存储两两站点的距离(因为A→B和B→A距离相同),这样查询距离的时间复杂度是O(1)。
- 提取所有唯一站点并排序,保证矩阵的行列顺序一致。
- 批量生成矩阵的表头和每一行,用字符串拼接的方式快速构建最终结果。
代码实现
def build_distance_matrix(distance_records): # 构建双向距离字典,O(m)时间,m是记录数 distance_map = {} for record in distance_records: src, dst, dist = record.split('|') dist = int(dist) # 初始化站点的映射表 if src not in distance_map: distance_map[src] = {} if dst not in distance_map: distance_map[dst] = {} # 双向存储距离 distance_map[src][dst] = dist distance_map[dst][src] = dist # 提取所有站点并排序,保证行列顺序一致 stations = sorted(distance_map.keys()) # 生成表头行 header = '|'.join(stations) # 生成每一行数据,用生成器表达式提升内存效率 rows = ( f"{src}|{'|'.join(['0' if src == dst else str(distance_map[src][dst]) for dst in stations])}" for src in stations ) # 组合表头和所有行,返回最终矩阵字符串 return '\n'.join([header] + list(rows)) # 测试示例 sample_records = [ 'A|B|5', 'A|C|3', 'A|D|9', 'B|C|7', 'B|D|2', 'C|D|6' ] matrix = build_distance_matrix(sample_records) print(matrix)
为什么这个方法更快?
- 规避数据库游标瓶颈:如果你的
fast_forward游标是从数据库逐行拉取数据,那网络/磁盘IO会成为600+站点场景的最大瓶颈。把所有数据一次性加载到本地处理,能完全消除这部分开销。 - O(1)距离查询:用字典存储距离,比任何线性查找的效率都高,生成矩阵时的查询操作几乎没有耗时。
- 内存高效:整个过程用生成器表达式逐行构建结果,不需要一次性把所有行都加载到内存,600个站点的场景下内存占用极低。
扩展处理
如果存在站点之间没有距离记录的情况,可以在查询时添加默认值,比如把生成行的逻辑改成:
rows = ( f"{src}|{'|'.join(['0' if src == dst else str(distance_map[src].get(dst, 'NA')) for dst in stations])}" for src in stations )
内容的提问来源于stack exchange,提问作者Dejan Dozet
相关产品推荐
相关产品推荐

