遍历列表并设置最大值 Python 的最有效方法是什么?

What is the most efficient way to loop through a list and set max value Python?

假设我有一个列表:

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%,但仍然太慢。

还有什么time/complexity有效的方法吗?

就时间复杂度而言,没有比这更高效的方法了。这必须是线性时间。如果您必须使用 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 ])

最 pythonic 的解决方案是:

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

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

In [4]: %timeit [x if x <0.2 else 0.2 for x in my_list]
每个循环 2.18 毫秒 ± 11.6 µs(7 次运行的平均值 ± 标准偏差,每次 100 次循环)

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