Хранение локального лучше, потому что поиск, который делает Python, быстрее.Это даже окупается, чтобы хранить функции локально.
На вопросы производительности лучше всего отвечать по времени - вы можете измерить это, используя timeit :
import timeit
def noTempFunc():
for _ in range(200):
max([1,4,5,6])
def tempFunc():
m = max
for _ in range(200):
m([1,4,5,6])
print(timeit.timeit(noTempFunc, number=1000)) # 0.055301458000030834
print(timeit.timeit(tempFunc, number=1000)) # 0.049811941999905684 : 11% faster
В этом случае max()
глобального контекста имеет толькодля поиска один раз, и дальнейший поиск выполняется локально, что на ~ 11% быстрее на основе этих чисел.
Это окупается, если вы используете локальный m()
несколько раз.
В вашем случае было бы разумно кэшировать len_list1 = len(list1)
- так как он используется много времени и не меняется.
Чтобы сделать его более читабельным, вы можете рассмотреть:
def isSublist(list1, list2):
"""Checks if list2 is a sublist of list1"""
len_part = len(list2) # reused inside the list comp, only "calulated" once
return any( x == list2 for x in (list1[i:i+len_part]
for i in range(len(list1)-len_part+1) ))
print(isSublist([1,2,3,4],[1]))
print(isSublist([1,2,3,4],[2,3]))
print(isSublist([1,2,3,4],[1,2,4]))
print(isSublist([1,2,3,4],[1,2,3,4]))
Вывод:
True
True
False
True
Поиски:
Ваша более быстрая версия с кэшированной длиной (на основе Скотт Мермельштейн ответ):
def isSublist1a(list1,list2): # cached length as well
l1 = len(list1)
for i in range(len(list2)):
part=list2[i:]
if len(part)<l1:
return False
if list1==part[:l1]:
return True
return False
list1=list(range(1000))
list2=list(range(400,420))
import timeit
print(timeit.timeit('isSublist1(list2,list1)', globals=globals(),number=1000))
print(timeit.timeit('isSublist1a(list2,list1)', globals=globals(),number=1000))
print(timeit.timeit('isSublist2(list2,list1)', globals=globals(),number=1000))
поставляет (2 исполнения):
0.08652938600062043 # cached part
0.08017484299944044 # cached part + cached list1 lenght - slightly faster
0.15090413599955355 # non-cached version
0.8882850420004615 # cached part
0.8294611960000111 # cached part + cached list1 lenght - slightly faster
1.5524438030006422 # non-cached version