微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 min() 多次或将其存储在变量中是否对性能更好? 速度内存使用

如何解决使用 min() 多次或将其存储在变量中是否对性能更好? 速度内存使用

我有一个小的 python 代码,它在同一个未更改的列表中多次使用 min(list),这让我想知道我是否使用了 min()len()函数的结果。 .. 多次在未更改的列表中对我来说将这些结果存储在变量中是否更好,这是否会影响内存使用/性能

如果我不得不猜测我会说,如果像 min() 这样的函数被多次调用,那么将它存储在变量中会更好地提高性能,但我不确定这一点,因为我不知道真的不知道 python 是如何获取值的,或者只要列表没有更改,python 是否会自动将此值存储在某处。

解决方法

速度

存储结果并重新使用它几乎总是比多次重新调用函数更便宜。

Python 不会缓存(存储并记住)来自 min()len() 等函数的结果。

这是一个快速的速度测试:

timeit.timeit("c = min(x) + min(x)","x = [1,2,3]")
0.24990593400000005

timeit.timeit("a = min(x); b = a + a",3]")
0.1296667110000005

第二个几乎快两倍,因为存储变量比重新调用 min 函数要便宜得多。

内存使用

如果结果是单个数字,如 min()len(),则内存使用可以忽略不计。

如果结果是实质性的(例如一个大的值表),那么您可以在完成后使用 del

将其删除
large_object = expensive_function()
do_something(large_object)
do_something_else(large_object)
del large_object

此外,当大型对象超出范围时(例如,当函数返回时)或定期进行垃圾收集轮次时,它们将自动从内存中删除。因此,del 仅在某些情况下是必需的,例如在处理对对象的循环引用时。

,

min() 与许多其他操作(例如 I/O)相比非常快。因此,对于短列表和只有少数重复调用的效率提升可能很小。但是,如果缓存 min() 的结果,则可以节省一些时间。有关您可以实际节省的时间的示例,请参阅下面的代码。如您所见,您需要对包含 min() 调用的循环进行多次迭代,以节省大量时间。

import timeit

lst = range(2)

def test_min():
    x = [min(lst) for i in range(10)]

def test_cached_min():
    min_lst = min(lst)
    x = [min_lst for i in range(10)]

print(timeit.timeit("test_min()",globals = locals(),number = 1000))
print(timeit.timeit("test_cached_min()",number = 1000))

# lst = range(2):
# 0.0027015960000000006
# 0.0010772920000000005

# lst = range(2000):
# 0.5262554810000001
# 0.05257684900000004
,

像 min 或 max 这样的函数每次肯定都必须遍历数组(使它们的复杂度为 O(n))。所以是的,特别是如果您的数组较大,最好将其存储在变量中而不是再次执行计算。

More details about performance in another question

,

Python 列表操作的时间复杂度

Complexity of List Operations

Source

表格显示:

  • 函数 len(获取长度)的复杂度为 O(1)(非常快,所以已经存储)
  • 函数 min(获得最小值)是 O(n)(取决于列表的大小,因此每次都计算)。

这意味着:

  • len 不需要存储以供重复使用
  • min 应该被存储以备重用(特别是对于大列表)
,

如果你只使用它 1-5 次,那其实并不重要。但是,如果您要再调用它,而且要少调用它,最好将其保存为变量。几乎不需要任何内存,而且只需很少的时间就可以将其从内存中提取出来。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。