持续排序10000条记录最快方法:df.nlargest与df.sort_values哪个更快
两种Pandas取最高成交量股票的方案性能对比
问题背景
需求为每秒读取3次更新后的price.csv文件,按volume字段排序后输出成交量最高的第一条股票记录,现有两种实现方案:
# 读取price.csv的股票价格,按成交量排序后输出成交量最高的股票记录 import pandas as pd while 1==1: try: df=pd.read_csv("R:/price.csv").dropna() # 第一种方法 # df=df.nlargest(1,'volume') # 第二种方法 # df.sort_values('volume',ascending=False,inplace=True) print("\t",df.iloc[0,0],df.iloc[0,1] ) except: pass del df
样本输出如下:
SNDL 79416563.0 SNDL 79552154.0 ITUB 20537823.0 PCG 24423451.0 EDU 104113726.0 TSM 5074870.0 EDU 105639190.0 ABEV 30110259.0 CEI 10292901.0 PCG 24739218.0 SWN 19374652.0
结论
第一种使用df.nlargest(1, 'volume')的方案运行速度更快,更适配每秒读取3次的高频使用场景
性能差异原因
nlargest是Pandas专门为「取Top N个最大值」场景做了优化的方法,不需要对全表数据做排序,只要遍历一次数据集就能筛选出volume最高的1条记录,时间复杂度为O(n),CSV里的股票条目越多,性能优势越突出- 第二种
sort_values方法会先对整个volume列做全量降序排序,时间复杂度为O(n log n),你最终只需要排序后的第一条记录,做了大量无用的排序计算,白白浪费性能
额外优化建议
你还可以调整代码进一步提升运行速度:
- 调用
pd.read_csv时加上usecols参数,只读取你需要输出的两列数据,不需要加载CSV里的所有字段 - 不要使用裸
except,建议指定捕获文件读取、索引相关的异常,避免吞掉其他意料之外的错误
内容的提问来源于stack exchange,提问作者Misha Zabrodin
相关产品推荐
相关产品推荐

