生成器与列表搜索中断

时间:2017-11-24 07:16:47

标签: python list generator

我有一个包含10万个元素的列表,我在该列表的末尾有一个元素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吗?

1 个答案:

答案 0 :(得分: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