Python 而不是setset2,那么代码将是O(n*m)@unutbu,酷。在我写完之后,我意识到了这一点。在出现明显差异之前,我们谈论的是什么样的数字?@PadraicChanningham:这可能取决于许多因素(换句话说,对于各种数据,为您自己进行基准测试是值得
Python 而不是setset2,那么代码将是O(n*m)@unutbu,酷。在我写完之后,我意识到了这一点。在出现明显差异之前,我们谈论的是什么样的数字?@PadraicChanningham:这可能取决于许多因素(换句话说,对于各种数据,为您自己进行基准测试是值得,python,arrays,algorithm,sorting,Python,Arrays,Algorithm,Sorting,而不是setset2,那么代码将是O(n*m)@unutbu,酷。在我写完之后,我意识到了这一点。在出现明显差异之前,我们谈论的是什么样的数字?@PadraicChanningham:这可能取决于许多因素(换句话说,对于各种数据,为您自己进行基准测试是值得的),但我发现当n,m=20,19时,使用一个集合比一个列表快2倍。我将在上面发布我的基准测试方法。我想在一个大的列表中,它会更快?干净和简单!谢谢:)@Padraiccanningham:是的,对于大型列表,这将快得多(线性复杂度与二次复杂度
而不是set
set2
,那么代码将是O(n*m)
@unutbu,酷。在我写完之后,我意识到了这一点。在出现明显差异之前,我们谈论的是什么样的数字?@PadraicChanningham:这可能取决于许多因素(换句话说,对于各种数据,为您自己进行基准测试是值得的),但我发现当n,m=20,19
时,使用一个集合比一个列表快2倍。我将在上面发布我的基准测试方法。我想在一个大的列表中,它会更快?干净和简单!谢谢:)@Padraiccanningham:是的,对于大型列表,这将快得多(线性复杂度与二次复杂度)。检查集合中的成员身份是O(1)
,而检查列表中的成员身份是O(n)
。上面是O(n)+O(m)
,其中n=len(arr1)
,m=len(arr2)
。如果您检查列表arr2
中的成员资格而不是setset2
,则代码将是O(n*m)
@unutbu,酷。在我写完之后,我意识到了这一点。在出现明显差异之前,我们谈论的是什么样的数字?@PadraicChanningham:这可能取决于许多因素(换句话说,对于各种数据,为您自己进行基准测试是值得的),但我发现当n,m=20,19
时,使用一个集合比一个列表快2倍。我将在上面发布我的基准测试方法。我想在一个大的列表中,它会更快?干净和简单!谢谢:)@Padraiccanningham:是的,对于大型列表,这将快得多(线性复杂度与二次复杂度)。检查集合中的成员身份是O(1)
,而检查列表中的成员身份是O(n)
。上面是O(n)+O(m)
,其中n=len(arr1)
,m=len(arr2)
。如果您检查列表arr2
中的成员资格而不是setset2
,则代码将是O(n*m)
@unutbu,酷。在我写完之后,我意识到了这一点。在出现明显差异之前,我们谈论的是什么样的数字?@PadraicChanningham:这可能取决于许多因素(换句话说,对于各种数据,为您自己进行基准测试是值得的),但我发现当n,m=20,19
时,使用一个集合比一个列表快2倍。我将在上面发布我的基准测试方法。
In [16]: set2 = set(arr2)
In [17]: [item for item in arr1 if item in set2]
Out[17]: [5, 1, 4, 6, 2]
In [20]: import random
In [21]: arr1 = range(20)
In [22]: random.shuffle(arr1)
In [23]: arr2 = random.sample(arr1, len(arr1)-1)
In [25]: %timeit set2 = set(arr2); [item for item in arr1 if item in set2]
100000 loops, best of 3: 2.13 µs per loop
In [26]: %timeit [item for item in arr1 if item in arr2]
100000 loops, best of 3: 4.49 µs per loop