Python新手优化嵌套for循环处理用户CSV数据问题求助
Python用户数据汇总代码性能优化方案
原有代码的核心问题
- 时间复杂度过高:原有嵌套循环逻辑为「遍历每个用户→遍历所有CSV行匹配」,时间复杂度为O(用户数 * CSV总行数),用户量较大时会出现明显的性能瓶颈
- 存在逻辑漏洞:遍历90天CSV的循环中,每次读取新的CSV都会覆盖
read_csv变量,最终仅会处理最后一天的CSV数据,前面89天的所有数据都会丢失 - 存在判断效率低:使用列表做用户名匹配判断,列表的
in操作时间复杂度为O(n),匹配效率极低
优化方案
核心优化思路
直接反转遍历逻辑,改为「遍历每个CSV行→判断用户是否在目标列表中」,单次遍历即可完成所有匹配操作,整体时间复杂度降到O(CSV总行数),同时将用户名列表转为集合,将存在判断的时间复杂度降到O(1)。
优化后可运行代码
import csv # 预初始化数据容器,同时构建用户名集合用于快速判断 main_data = {} user_set = set() with open("./listofusernames.txt") as usernames: username_list = usernames.read().splitlines() for user in username_list: main_data[user] = [] user_set.add(user) # 遍历所有CSV文件,读取的同时直接处理数据 for i in range(1, 91): csvdir = f"./csvfiles/usagedata_{i}.csv" with open(csvdir, 'r') as daily_usage_csv: csv_reader = csv.reader(daily_usage_csv) # 单次遍历CSV行即可完成所有匹配 for line in csv_reader: username = line[0] if username in user_set: main_data[username].append(line[1]) main_data[username].append(line[2])
额外优化建议
如果你的数据量非常大,还可以用pandas做批量向量化处理,速度会比纯Python循环快数倍到数十倍,示例代码如下:
import pandas as pd # 读取用户名列表 with open("./listofusernames.txt") as f: username_list = f.read().splitlines() # 批量读取所有CSV并合并 all_data = [] for i in range(1,91): path = f"./csvfiles/usagedata_{i}.csv" df = pd.read_csv(path, header=None, usecols=[0,1,2], names=["username", "val1", "val2"]) # 直接过滤目标用户 df = df[df["username"].isin(username_list)] all_data.append(df) # 合并后按用户分组聚合 merged = pd.concat(all_data) main_data = merged.groupby("username")[["val1", "val2"]].apply(lambda x: x.values.flatten().tolist()).to_dict()
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

