这就是我想要做的。计算数据的输出给出了一个数字。我使用这个数字来对不同的数据进行排序,我需要保留top-N (在下面的示例中,选择了前10位)。排序是通过将数字与反向排序列表的最后编号进行比较来实现的。如果当前数字较大,则会弹出列表,并将新条目添加到列表中,然后再进行反向排序。以下内容在结构上与我所拥有的完全相同,虽然速度很慢,但仍然有效。我希望有任何建议,以提高它的速度,效率或皮特尼奥尼。
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一次又一次的建议。
发布于 2016-02-19 05:51:02
记住,在Python中,列表实际上只是指向它们包含的内容的指针。因此,某些列表操作可以非常快,即使列表包含一些相当重的数据结构(例如,您的示例中的DataFrames )。您的方法包括列出一个小列表(10项长),并不断修改它以“正确”,因为更多的DataFrames被“考虑”到前十位,这对我来说有点不必要。我只会列出所有候选的大列表,排序一次,然后取前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]
发布于 2016-02-19 09:34:45
加快速度的方法是用大小为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
当然,这假定您可以使用一个min堆实现。我怀疑赫普会做到这一点。
这将比每次插入新项目时排序列表要快得多。
https://stackoverflow.com/questions/35505450
复制相似问题