gpt4 book ai didi

python - Python 中的列表理解以计算列表的最小值和最大值

转载 作者:太空狗 更新时间:2023-10-29 22:09:22 24 4
gpt4 key购买 nike

我有以下代码来计算列表的最小值和最大值以节省内存效率

x_min = float('+inf')
x_max = float('-inf')

for p in points_in_list:
x_min = min(x_min, p)
x_max = max(x_max, p)

其中 points_in_list 是一个(大)数字列表。我想知道是否有一种方法可以使用 List Comprehensions 计算最小值和最大值并节省内存。

最佳答案

我是生成器和理解的忠实粉丝,但在这种情况下,它们似乎不是正确的方法,因为:

  1. 你想计算列表的minmax
  2. 你的名单很大

如果您只想计算minmax 中的一个,您可以只对它使用min/max 函数。但是因为你想要两者,你将不得不遍历列表两次以首先提取最小值然后提取最大值。 IE。像这样:

x_min = min(points)
x_max = max(points)

让我们玩一些时间。首先调用列表中的最小值和最大值:

>>> import timeit
>>> def with_gens(l):
... return min(l), max(l)
...
>>> timeit.timeit('with_gens(range(6000000))', 'from __main__ import with_gens', number=5)
1.7451060887015188

现在只循环一次,使用你的代码:

>>> def with_loop2(l):
... x_max = float('+inf')
... x_min = float('-inf')
... for el in l:
... x_min = min(x_min, el)
... x_max = max(x_max, el)
... return x_min, x_max
...
>>> timeit.timeit('with_loop2(range(6000000))', 'from __main__ import with_loop2', number=5)
11.636076105071083

疯了吧?

这种方法完全没有内存问题。但是,它在每个循环中设置了 x_maxx_min,这实际上是一种不必要的浪费:您只想在找到更大/更小的值时重置变量。我们可以轻松解决这个问题。

所以...让我们尝试只循环一次,但要避免不必要的重置。

>>> def with_loop(l):
... x_min = float('-inf')
... x_max = float('+inf')
... for el in l:
... if el < x_min:
... x_min = el
... elif el > x_max:
... x_max = el
... return x_min, x_max
...
>>> timeit.timeit('with_loop(range(6000000))', 'from __main__ import with_loop', number=5)
3.961046726963332

哦惊喜

虽然只循环一次的算法在纸面上看起来更高效,但它被 minmax 的内部优化打败了。此外,在每个循环中设置 var 和仅在必要时设置 var 之间的区别是巨大的。 你永远不会停止学习

关于python - Python 中的列表理解以计算列表的最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25134995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com