python中lis的意思_Python中计算lis最小值和最大值的列表理解

我非常喜欢发电机和理解,但在这种情况下,它们似乎不是正确的方法,因为:要计算列表的min和max

你的单子很大

如果您只想计算min或max中的一个,则可以对其使用min/max函数。但是由于两者都需要,因此必须循环遍历列表两次,先提取最小值,然后提取最大值,例如:x_min = min(points)

x_max = max(points)

我们来玩玩计时吧。首先调用列表中的min和max:>>> 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_max和x_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

哦,惊喜

虽然只循环一次的算法在纸上更有效,但它被min和max的内部优化击败。此外,在每个循环中设置var与仅在必要时设置var之间的差异是巨大的。你永远不会停止学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值