给定大量学生分数,如何获得 N 个最高分的名字?

How to obtain the names of N highest scorers given a large dataset of student scores?

我有一个包含大型数据集(超过 9000 万个条目)的 .txt 文件,格式如下:

Score Student Name
35 Lily
45 Rex
20 Cameron
45 Max
20 Jasmin

在文本文件中,乐谱和名称由 2 个空格分隔,每行一个乐谱名称条目

无法一次将此 .txt 文件加载到内存中。

如何获得python的前N个最高分?
注意:N的值可以很大

示例:
所以当N=2时,

输出应该是:
雷克斯
最大值

在python中有没有办法直接获取前N个得分手而不用另一种文件格式再次保存整个数据?

哪种方式效率更高?
1.) 一个一个读取分数条目和save/update最大的N个分数条目?
2.) 将所有数据移动到 pandas 数据帧并使用 nlargest ?

将文本文件读入 pandas DataFrame the answer to that is here.
然后您可以尝试以下操作: 您可以尝试使用 pandas nlargest。例如你可以这样做:

largest = df.nlargest(n,'score')['Student Name']

您还可以将 score 列转换为 Numpy 数组并使用 argsort

import numpy as np
largest = df.iloc[np.argsort(-df['score'])[:n]]['Student Name']

此外,您可以尝试对 DataFrame 进行排序并取前 n 行,如下所示:

largest = df.sort_values('score', ascending=False).iloc[:n]['Student Name']

这是具有 1 亿条记录的 DataFrame 和 n=1000000

的运行时间比较
 df = pd.DataFrame(np.random.randint(0, 100, size=(100000000, 2)),  columns=['score', 'Student Name'])
 n = 1000000
 start = time()
 temp = df.nlargest(n, 'score')['Student Name']
 print(time() - start)

 start = time()
 temp2 = df.iloc[np.argsort(-df['score'])[:n]]['Student Name']
 print(time() - start)

 start = time()
 temp3 = df.sort_values('score', ascending=False).iloc[:n]['Student Name']
 print(time() - start)

结果:

3.5889642238616943
13.237002849578857
19.69099760055542

所以最有效的方法是使用 nlargest