Это зависит от того, что вы пытаетесь сделать. Если скорость не имеет значения, используйте значение lst. Если это имеет значение, это будет зависеть от того, сможете ли вы сначала преобразовать свой список в другую структуру данных (т. Е. Будете ли вы часто искать элементы в, скажем, списке), размер и т. Д ...
Чтобы дать идею:
import timeit
a = range(10000)
da = dict(zip(a, [None for i in a]))
def list_first():
return 0 in a
def dict_first():
return 0 in da
def list_last():
return 9999 in a
def dict_last():
return 9999 in da
if __name__ == "__main__":
for f in ["list_first", "dict_first", "list_last", "dict_last"]:
t = timeit.Timer("%s()" % f, setup="from __main__ import %s" % f)
print min(t.repeat(number=10000))
Это дает мне:
0.00302004814148
0.00318598747253
4.21943712234
0.004145860672
Если вы ищете предмет, который находится в начале списка, использование dict не ускоряет процесс, как ожидалось. Если вы ищете элемент в конце, тогда разница будет очень значительной (на 3 порядка), хотя, как и ожидалось, нужно использовать hashtable, списки должны искать каждый элемент один за другим.
Если элементы сопоставимы, вы также можете значительно ускорить процесс сортировки последовательности и использовать бинарный поиск (log (N) вместо N, log (N) относительно быстро по сравнению с O (1) для N не слишком) большой на практике для Python), или с использованием более сложных структур (бинарное дерево поиска и т. д.). Это может быть довольно сложным - структуры данных для быстрого поиска - одна из наиболее изученных проблем в CS.