该方法的另一种index
方法是一次构建位置字典,而不是每次都搜索列表。如果列表足够长,这应该更快,因为它使过程在元素数量(平均)上呈线性,而不是二次。具体来说,而不是
def index_method(la, lb):
return [lb.index(i) for i in la]
你可以使用
def dict_method(la, lb):
where = {v: i for i,v in enumerate(lb)}
return [where[i] for i in la]
这应该在小列表上大致可比,尽管可能会慢一点:
>>> list_a = ['s{}'.format(i) for i in range(5)]
>>> list_b = list_a[:]
>>> random.shuffle(list_b)
>>> %timeit index_method(list_a, list_b)
1000000 loops, best of 3: 1.86 µs per loop
>>> %timeit dict_method(list_a, list_b)
1000000 loops, best of 3: 1.93 µs per loop
但在较长的情况下应该会快得多,而且差异只会越来越大:
>>> list_a = ['s{}'.format(i) for i in range(100)]
>>> list_b = list_a[:]
>>> random.shuffle(list_b)
>>> %timeit index_method(list_a, list_b)
10000 loops, best of 3: 140 µs per loop
>>> %timeit dict_method(list_a, list_b)
10000 loops, best of 3: 20.9 µs per loop