【问题标题】:How can I make my code to find the minimum faster?如何让我的代码更快地找到最小值?
【发布时间】:2020-12-15 15:17:05
【问题描述】:

我有一个关于如何以我的方式在列表中找到最小值的问题:

我有一个很大的列表,其中每条记录都是这样的:

['22:00:19', '0026f88e557225333f01', '23', '37', '', '176.2', '0', '60', 'SOMETHING', 
 3.318717958567554e-05]

但列表中的第一条和最后一条记录不包含最后一个数字:

例如:

['22:00:09', '0026f88e557225333f01', '23', '37', '', '176', '0', '60', 'SOMETHING']

我需要在每次调用我的函数时找到最后一列 3.318717958567554e-05 的最小值及其索引。

这是我的代码:

def find_min(data, size, num):

    for index, i in enumerate(data):

        if index == 0 or index == data.__len__() -1: continue

        if index == 1:
            minimum = float(i[9])
            idx = index
            continue

        if float(i[9]) < minimum or float(i[9]) < num:
            minimum = float(i[9])
            idx = index

    return idx, minimum

num 是用户定义的阈值,用于计算最小值。 (最小值应该小于这个值。) 这段代码工作正常,我找到了我想要的,但是我怎样才能让我的代码更快,因为我调用了这个函数一千次,我使用的是一个巨大的数据集,因此执行时间非常长,因为这个函数很慢。

【问题讨论】:

  • 不要使用 __len__() - 使用len(data)
  • 如果这是您的主要瓶颈,请考虑以优化方式对您的数据进行排序或索引,以便能够快速找到此答案,而无需进行全面扫描。跨度>

标签: python python-3.x time min execution


【解决方案1】:

摆脱所有if 语句并将数组分割成您关心的那些。

i[9] 转换为只浮动一次。

def find_min(data, size, num):
    idx = 1
    minimum = float(data[1][9])
    for index, i in enumerate(data[2:-1]):        
        f = float(i[9])
        if f < minimum or f < num:
            minimum = f
            idx = index + 2 # +2 because of the slicing
    
    return idx, minimum

或者如果列表太大以至于制作一个切片太昂贵,只需迭代索引:

def find_min(data, size, num):
    idx = 1
    minimum = float(data[1][9])
    for index in range(2, len(data)-1):     
        f = float(data[index][9])
        if f < minimum or f < num:
            minimum = f
            idx = index
    
    return idx, minimum

【讨论】:

  • 谢谢您,先生,您的第二个解决方案帮助了我!
  • 不应该是minimum = float(data[1][9])吗?
  • 另外,与其迭代 range 并索引到列表中,直接迭代 for row in data: 然后 try: f = float(row[9]) except IndexError: continue 几乎肯定会更快
  • 有必要进行基准测试来确认,但我认为索引速度很快。
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2015-07-26
  • 2017-08-28
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多