这是我想要做的。数据帧上的计算输出给出一个数字。我使用该数字来排列不同的数据帧,我需要保留前N个(在下面的示例中,选择前10个)。通过将数字与反向排序列表的最后数量进行比较来实现排名。如果当前数字较大,则弹出列表并将新条目添加到列表中,然后再次进行反向排序。以下内容在结构上与我所拥有的完全相同,虽然速度很慢,但仍有效。我很感激任何提高其速度,效率或Pythonicness的建议。
import random
import pandas as pd
def gen_df():
return random.uniform(0.0, 1.0), pd.DataFrame()
if __name__ == '__main__':
mylist = []
for i in range(1000):
val, df = gen_df()
if len(mylist) < 10:
mylist.append((val, df))
else:
mylist.sort(reverse=True)
if mylist[-1][0] < val:
mylist.pop()
mylist.append((val, df))
编辑:在zondo的建议之后减少了一种。
答案 0 :(得分:1)
加快速度的方法是用大小为10的最小堆替换你的列表。将前10帧放入堆中。然后,对于每个项目,如果它大于堆上的最小项目,则弹出最小的项目并推送新项目。
我不是Python程序员,因此我将展示伪代码。
heap = new min-heap
for each item
if (heap.length < 10)
heap.push(item)
else if (item > heap.peek())
heap.pop(); // remove smallest item
heap.push(item); // add new item
当然,这假设您可以使用最小堆实现。我怀疑heapq会做到这一点。
这会比每次插入新项目时对列表排序快得多。
答案 1 :(得分:0)
请记住,在Python中,列表实际上只是指向它们包含的内容的指针。因此,即使列表包含一些非常繁重的数据结构(即示例中的DataFrame),某些列表操作也可能非常快。您的方法涉及制作一个小列表(10个项目长)并不断修改它为“正确”,因为更多的DataFrame被“考虑”为前10个。这对我来说感觉有点不必要。我只想列出所有候选者的一个大列表,排序一次,然后取第一个10.此外,追加比插入慢,所以最好一次性分配内存。
我的猜测是,对于大数据集,我在下面列出的方法会更快一些。但无论如何,我发现它更具可读性。
def get_top_10_so():
mylist = []
for i in range(1000):
val, df = gen_df()
if len(mylist) < 10:
mylist.append((val, df))
else:
mylist.sort(reverse=True)
if mylist[-1][0] < val:
mylist.pop()
mylist.append((val, df))
return mylist
def get_top_10_mine():
mylist = [None] * 1000
for i in range(1000):
mylist[i] = gen_df()
mylist.sort(key=lambda tup: tup[0], reverse=True)
return mylist[:10]