如何在python上优化这些代码并使其更快



确定数组中是否使用了某个范围的所有值,同时数组中是否没有不在该范围内的值。例如,范围是[1,5],数组是[1,2,3,4,5]——一切都是正确的。或者范围[1,5]和数组[1,2,1,2,3,3,4,5]-一切都是真的。范围是[1,5],阵列[0,2,2,3,3,4,5]已经不正确,因为该范围中没有0,并且阵列中也缺少1

我这样做了,但它很慢,价值很高,而且很糟糕:

def func(segment, arr):
segment_arr = []
for i in range(segment[0], segment[1] + 1):
segment_arr.append(i)
arr_corr = True
if min(arr) != min(segment_arr) or max(arr) != max(segment_arr):
arr_corr = False
else:
for i in range(len(arr)):
if arr[i] in segment_arr:
for a in range(len(segment_arr)):
if segment_arr[a] in arr:
continue
else:
arr_corr = False
else:
arr_corr = False
return arr_corr 

测试列表/数组/范围x的每个成员是否都在另一个列表/数组y中:

all(e in y for e in x)

测试是否只有列表/数组/范围x的成员在另一个列表/数组y中:

all(e in x for e in y)

这些操作的速度取决于容器类型。all短路,所以当测试失败时会更快。inset上非常快,但在列表上可能很慢。set的创建是缓慢的,并且可以消除在集合上执行in的速度带来的增益。如果您使用的是numpy数组,那么使用numpy的intersect会更快。

这应该符合你的要求。如果速度太慢,则需要优化类型。在这一点上,你可能需要编辑这个问题,以给出一些明确的例子,说明它什么时候太慢,以及你的限制是什么:

def func(segment, arr):
return all(e in segment for e in arr) and all(e in arr for e in segment)
def func(segment, arr):
return set(list(range(segment[0], segment[1]+1))) == set(arr)
  1. 根据允许的值构建一个集合
  2. 如果结果集具有"0";"满";长度,都是正确的
left, right = [1, 5]
values = [0, 2, 3, 4, 5]
values_are_correct = (
len({i for i in values if left <= i <= right}) == (right - left) + 1
)

最新更新