Python如何加速获取DataFrame中不存在于另一列的用户列表的操作
Pandas 跨表成员判断性能优化方案
- 方案1:使用Pandas原生向量化操作(最优推荐)
Pandas内置的isin()方法底层为C实现,完全规避Python级循环开销,10万级数据可毫秒级完成计算,代码示例:
# 直接得到非推荐人用户的唯一值数组,需要转集合可套set() non_referees = whole_data[~whole_data['user_id'].isin(referrals['referee_id'])]['user_id'].unique()
- 方案2:优化集合操作逻辑
如果需要保留集合类型操作,不需要手动写列表推导做判断,直接使用Python集合内置的差集运算,底层同样为优化后的C实现,比手动循环快5~10倍:
users = set(whole_data['user_id']) referees = set(referrals['referee_id']) # 直接用集合差运算符,无需手动遍历判断 non_referees = users - referees
- 方案3:使用Numpy运算进一步提速
如果两列id均为数值类型,可调用Numpy的集合差方法,性能还能再提升:
import numpy as np non_referees_arr = np.setdiff1d(whole_data['user_id'].values, referrals['referee_id'].values) # 转集合可执行 non_referees = set(non_referees_arr)
原代码性能瓶颈出现在手动编写的列表推导环节:虽然set的成员判断时间复杂度为O(1),但Python层级的循环遍历本身存在极高的执行开销,10万次遍历的耗时会远高于底层C实现的批量运算。上述三种方案均规避了Python级循环,在你的数据量级下基本可以实现秒内返回结果。
内容的提问来源于stack exchange,提问作者Eugenio.Gastelum96
相关产品推荐
相关产品推荐

