遍历列表并设置最大值 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 回复
假设我有一个列表:
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 回复