с Numpy массивами (что будет быстрее для больших массивов), то вы могли бы проверить длину списков затем (также) проверить перекрывающих друг друга ЧАСТЕЙ что-то вроде следующего (очевидно нарезка дольше длине короче):
import numpy as np
n = min(len(test1), len(test2))
x = np.where(test1[:n] != test2[:n])[0]
if len(x) > 0:
ans = x[0]
elif len(test1) != len(test2):
ans = n
else:
ans = None
EDIT - несмотря на т его проголосовали, я оставлю свой ответ здесь, если кому-то еще нужно сделать что-то подобное.
Если стартовые массивы большие и числовые, то это самый быстрый способ. Также мне пришлось изменить код Энди, чтобы заставить его работать. В порядке: 1. мое предложение, 2. Paidric (теперь удалено, но самый изящный), 3. принятый ответ Энди, 4. zip - non numpy, 5. vanilla python без почтового индекса в соответствии с @leekaiinthesky
0.1 мс, 9.6ms, 0.6ms, 2.8ms, 2.3ms
, если преобразование в ndarray включена в timeit то не-NumPy метод NOP-молния является самым быстрым
7.1ms, 17.1ms, 7,7 мс, 2,8 мс, 2,3 мс
и даже больше, если разница между этими двумя списками есть около индекса 1000, а не 10000
7.1ms, 17.1ms, 7.7ms, 0.3ms, 0,2 мс
import timeit
setup = """
import numpy as np
from itertools import zip_longest
list1 = [1 for i in range(10000)] + [4, 5, 7]
list2 = [1 for i in range(10000)] + [4, 4]
test1 = np.array(list1)
test2 = np.array(list2)
def find_first_diff(l1, l2):
for index, (x, y) in enumerate(zip_longest(l1, l2, fillvalue=object())):
if x != y:
return index
def findFirstDifference(list1, list2):
minLength = min(len(list1), len(list2))
for index in range(minLength):
if list1[index] != list2[index]:
return index
return minLength
"""
fn = ["""
n = min(len(test1), len(test2))
x = np.where(test1[:n] != test2[:n])[0]
if len(x) > 0:
ans = x[0]
elif len(test1) != len(test2):
ans = n
else:
ans = None""",
"""
x = np.where(np.in1d(list1, list2) == False)[0]
if len(x) > 0:
ans = x[0]
else:
ans = None""",
"""
x = test1
y = np.resize(test2, x.shape)
x = np.where(np.where(x == y, x, 0) == 0)[0]
if len(x) > 0:
ans = x[0]
else:
ans = None""",
"""
ans = find_first_diff(list1, list2)""",
"""
ans = findFirstDifference(list1, list2)"""]
for f in fn:
print(timeit.timeit(f, setup, number = 1000))
Сортировка по умолчанию? –
Нет, элементы не отсортированы. Я пробовал различные операторы numpy до сих пор – Andy
Являются ли они на самом деле множеством массивов или списков? –