Кажется, что проверка Dict ключей как набор несколько быстрее:Проверка на существование в Словаре против множества в питоне
import random
import string
import timeit
repeat = 3
numbers = 1000
def time(statement, _setup=None):
print min(
timeit.Timer(statement, setup=_setup or setup).repeat(
repeat, numbers))
random.seed('slartibartfast')
# Integers
length = 100000
d = {}
for _ in range(length):
d[random.randint(0, 10000000)] = 0
s = set(d)
setup = """from __main__ import s, d, length
"""
time('for i in xrange(length): check = i in d')
time('for i in xrange(length): check = i in s')
# Strings
d = {}
for _ in range(length):
d[''.join(random.choice(string.ascii_uppercase) for __ in range(16))] = 0
s = set(d)
test_strings= []
for _ in range(length):
test_strings.append(random.choice(string.ascii_uppercase) for __ in range(16))
setup = """from __main__ import s, d, length, test_strings
"""
time('for i in test_strings: check = i in d')
time('for i in test_strings: check = i in s')
печатает что-то вроде:
10.1242966769
9.73939713014
10.5156763102
10.2767765061
Это следует ожидать или случайный артефакт?
Удивительно, стоит ли создавать наборы ключей для ключей с клавишами с интенсивным усилением.
Редактировать: мои измерения действительно заставляют меня задуматься о базовой реализации, я не пытаюсь сохранить микросекунды, мне просто интересно - и да, если окажется, что базовая реализация действительно благоприятствует наборам, я мог бы создать набор этих ключей dict - или нет (я фактически исправляю старый код).
Вы проверяете пустой комплект & dict? потому что вы вообще не используете «случайный». это намеренно? –
Если производительность настолько критична, что различия в малых долях миллисекунды имеют значение, Python, вероятно, является неправильным языком для использования. Я бы пошел на чтение с сохранением 0,2 секунды на 100 000 итераций. –
@ Jean-FrançoisFabre: deamon copy paste –