发电机与列表搜索中的中断



我有100 000个元素的列表,我在该列表的末端有一个4。

在这一点上,这些方法有什么区别?

方法1:

def arr_f():
  for i in arr:
      if i==4:
          yield i
arr=[........100k entries]
gen_ob=arr_f()
for i in gen_ob:
    #do some op

方法2:

def arr_f():
  for i in arr:
      if i==4:
          break
  else:
      return True
  return False

在方法2中,如果我击中循环,我正在等待4号循环。在这种情况下,发电机是否比方法2?

我在发电机上所知道的是,它会产生一个价值。 就我而言,我的方法2是否存储比方法1?

更多的元素

在进行比较之前,我将重写您的功能,使其纯粹是纯函数:

def f1(array, val):
    for i in array:
        if i == val:
            yield i
def f2(array, val):
    for i in array:
        if i == val:
            return False
    
    return True

我以为您的意思是返回False,如果存在该值,则否则True否则。如果没有,请修复您的缩进。


不幸的是,比较f1f2没有多大意义,因为它们似乎做了不同的事情。一个只是产生多个版本的val,而另一个仅检查val是否存在(并且有很多简单的方法可以做到这一点)。

f1(arr, 4)f2(arr, 4)之间有什么区别,给定4arr中的最后一个元素?

唯一的区别是f1将发电机返回到迭代,而f2返回标量bool值。


在一般方案中,f1(arr, K)f2(arr, K)之间有什么区别,其中Karr中的任何值中都存在任何值?

f1 找到K后不会停止迭代。它将始终在整个列表中继续迭代。因此,平均,最差和最佳情况的复杂性是线性的。

同时,f2找到了K的首次出现并相应地返回一个值。由于K可以在列表中的任何位置,因此f2的运行时间取决于您的输入。

请记住,无论如何,两者都具有最坏的线性复杂性(O(N))。

请注意,f2可以重写为:

def f2(array, val):
    return val not in array # you could convert to a set, but the conversion is linear, making the subsequent O(1) lookup pointless

最新更新