首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在遍历所有元素时保留top-N元素

在遍历所有元素时保留top-N元素
EN

Stack Overflow用户
提问于 2016-02-19 12:31:46
回答 2查看 72关注 0票数 1

这就是我想要做的。计算数据的输出给出了一个数字。我使用这个数字来对不同的数据进行排序,我需要保留top-N (在下面的示例中,选择了前10位)。排序是通过将数字与反向排序列表的最后编号进行比较来实现的。如果当前数字较大,则会弹出列表,并将新条目添加到列表中,然后再进行反向排序。以下内容在结构上与我所拥有的完全相同,虽然速度很慢,但仍然有效。我希望有任何建议,以提高它的速度,效率或皮特尼奥尼。

代码语言:javascript
运行
复制
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一次又一次的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-19 13:51:02

记住,在Python中,列表实际上只是指向它们包含的内容的指针。因此,某些列表操作可以非常快,即使列表包含一些相当重的数据结构(例如,您的示例中的DataFrames )。您的方法包括列出一个小列表(10项长),并不断修改它以“正确”,因为更多的DataFrames被“考虑”到前十位,这对我来说有点不必要。我只会列出所有候选的大列表,排序一次,然后取前10。而且,追加比插入慢,所以最好一次分配内存。

我的猜测是,对于大数据集,我在下面阐述的方法会更快一些。但无论如何,我觉得它的可读性更强一些。

代码语言:javascript
运行
复制
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]
票数 0
EN

Stack Overflow用户

发布于 2016-02-19 17:34:45

加快速度的方法是用大小为10的最小堆替换列表,将前10帧放入堆中。然后,对于每个项,如果它大于堆中最小的项,则弹出最小的项并推送新项。

我不是Python程序员,所以我将介绍伪代码。

代码语言:javascript
运行
复制
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堆实现。我怀疑赫普会做到这一点。

这将比每次插入新项目时排序列表要快得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35505450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档