我有一个包含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吗?
答案 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
。如果没有,请修改你的缩进。
不幸的是,比较f1
和f2
没有多大意义,因为他们似乎做了不同的事情。一个简单地产生val
的多个版本,而另一个只检查val
是否存在(并且有更简单的方法)。
f1(arr, 4)
和f2(arr, 4)
之间的区别是什么,4
是arr
中的最后一个元素?
唯一的区别是f1
返回生成器进行迭代,而f2
返回标量bool
值。
找到一般情况下
f1(arr, K)
和f2(arr, K)
之间的区别是什么,其中K
是arr
中任何位置的任何值?
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