如何提升百万级列表中字符串比对的执行速度?
百万级数据城市比对分类写入的性能优化方案
这个场景我太熟悉了!原代码的嵌套循环在百万级数据下简直是性能灾难,给你几个落地性极强的优化方案,一步步把速度拉起来:
1. 先分组再写入:把O(N*M)降到O(N+M)
原代码最大的问题是重复遍历销售数据——每处理一个城市,就要把所有salesData扫一遍。我们可以先遍历一次salesData,按城市把数据分组,之后直接按分组写入文件,这样时间复杂度直接从O(N*M)降到O(N+M),百万级数据下差异会特别明显。
用Python的collections.defaultdict实现会很方便:
from collections import defaultdict # 先一次性完成分组 city_groups = defaultdict(list) for data in salesData: city = data[2] # 提前把要写入的字符串处理好,避免后续重复操作 line = " ".join(data) + "\n" city_groups[city].append(line) # 再按分组写入文件 for city, lines in city_groups.items(): with open(f"{city}.txt", "a+") as file: # 一次性写入所有行,减少IO次数 file.writelines(lines)
这里还顺便优化了字符串处理:原代码的",".join(data).replace(","," ")完全可以直接用" ".join(data)代替,省了一次replace的开销。
2. 极致优化文件IO:减少磁盘交互次数
磁盘IO是程序性能的最大瓶颈之一,原代码每次处理城市都打开/关闭文件,还逐行写入,效率极低。上面的方案已经用writelines一次性写入所有行,再补充两个小技巧:
- 用
with语句管理文件上下文,不仅安全,还能减少手动关闭文件的开销; - 如果是覆盖写入而非追加,可以直接用
w模式代替a+,避免文件指针移动的额外操作。
3. 用Pandas处理大数据:专业工具做专业事
如果你的数据量真的达到百万级甚至更高,纯Python循环还是不够快,直接用Pandas会爽很多——它底层用C实现了分组和IO操作,性能碾压纯Python:
import pandas as pd # 把salesData转成DataFrame df = pd.DataFrame(salesData) # 按第3列(城市列)分组,然后写入对应文件 for city, group in df.groupby(2): # 直接用空格分隔写入,不用手动处理字符串 group.to_csv(f"{city}.txt", sep=" ", index=False, header=False, mode="a+")
Pandas的groupby和to_csv都做了大量性能优化,百万级数据下比纯Python快几倍甚至几十倍。
4. 额外小优化:提前去重&减少内存占用
如果uniqueCity是自己生成的,其实完全不需要——分组后city_groups的key就是所有存在的城市,直接用这个key集合就行,省掉生成uniqueCity的步骤;另外,如果salesData里有重复数据,可以先去重再处理,减少后续的分组和写入工作量。
内容的提问来源于stack exchange,提问作者Hey Man
相关产品推荐
相关产品推荐

