【问题标题】:What is the most efficient way to loop through a list and set max value Python?遍历列表并设置最大值 Python 的最有效方法是什么?
【发布时间】:2021-03-27 03:16:27
【问题描述】:

假设我有一个清单:

my_list = [0.1, 0.14, 0.1, 0.03, 0.3, 0.01, 0.6]

我想将最大值限制为 0.2,所以想要的结果是:

my_list

[0.1, 0.14, 0.1, 0.03, 0.2, 0.01, 0.2]

我试过了

[0.2 if x>0.2 else x for x in my_list]

还有

list(map(lambda x: min(x,0.2),my_list))

发现第一个效率提高了大约 5-10 %,但仍然太慢。

还有什么更节省时间/复杂性的方法吗?

【问题讨论】:

  • 您是否尝试过将 numpy 与 np.clip(my_list, a_max=0.2) 一起使用?
  • 时间复杂度明智,没有更有效的方法。这必须是线性时间。如果您必须使用 Python 列表,那么可能没有什么比这两种方法更快的了。但是,如果您使用numpy,则可以使用numpy 更快地完成此类事情。
  • [x for x in my_list if x < 0.2] + [0.2] ?顺便说一句,如果你关心效率,你不应该使用 Python...

标签: python list performance iteration max


【解决方案1】:

最pythonic的解决方案是:

在 [3] 中:%timeit [min(x,0.2) for x in my_list]
每个循环 10.5 毫秒 ± 302 微秒(7 次运行的平均值 ± 标准偏差,每次 100 次循环)

快速(但失去了一些可读性)

在 [4] 中:%timeit [x if x
每个循环 2.18 毫秒 ± 11.6 微秒(7 次运行的平均值 ± 标准偏差,每次 100 次循环)

如果您有大量数据并且可以使用像 numpy 这样的数值库, 见@juampa 回复

【讨论】:

    【解决方案2】:

    就时间复杂度而言,没有比这更有效的方法了。这必须是线性时间。如果您必须使用 Python 列表,那么可能没有什么比这里的方法快明显了。但是,如果您使用numpy,则可以使用numpy 更快地完成此类操作。

    In [2]: my_list = [0.1, 0.14, 0.1, 0.03, 0.3, 0.01, 0.6]*10_000
    
    In [3]: import numpy as np
    
    In [4]: my_array = np.array(my_list)
    
    In [5]: %timeit [0.2 if x>0.2 else x for x in my_list]
       ...:
    2.52 ms ± 14.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    In [6]: %timeit my_array.clip(max=0.2)
    89.7 µs ± 1.27 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    

    如您所见,89.7 µs / 2.52 ms == 0.0356,所以使用 numpy,它只需要大约 3-4% 的列表所需时间,IOW 它快 27 倍

    只是为了向您展示他们正在做同样的事情:

    In [8]: [0.2 if x>0.2 else x for x in my_list]
    Out[8]: [0.1, 0.14, 0.1, 0.03, 0.2, 0.01, 0.2]
    
    In [9]: my_array = np.array(my_list)
    
    In [10]: my_array
    Out[10]: array([0.1 , 0.14, 0.1 , 0.03, 0.3 , 0.01, 0.6 ])
    
    In [11]: my_array.clip(max=0.2)
    Out[11]: array([0.1 , 0.14, 0.1 , 0.03, 0.2 , 0.01, 0.2 ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2022-09-28
      相关资源
      最近更新 更多