Вы на самом деле не доказали, что поиск в словаре быстрее, чем два if
теста.Вы показали, что поиск в этом конкретном словаре выполняется быстрее, чем эти два теста.
Обычно для поиска в словаре требуется несколько шагов: сгенерируйте хеш из ключа, чтобы найти потенциальное совпадение, а затем протестируйте потенциальное совпадение.сравнивая ключи.Иногда может потребоваться несколько сравнений, если есть коллизии хеш-таблиц.Если у вас есть пользовательские классы для ключей, то оба эти шага могут быть медленными, они обычно бывают быстрыми для строк, но в одном конкретном случае они действительно очень быстрые, и вы попали в этот случай.
Вашсловарь использует ключи, которые являются короткими строками, которые соответствуют формату для идентификаторов, известных во время компиляции.Python услужливо «интернирует» ваши строки «R» и «F».Поскольку строки, которые вы используете в своих тестах, также известны во время компиляции, они будут точно такими же экземплярами.Что все это означает для поиска по словарю, так это то, что специализированная версия поиска используется для словаря, который имеет только строковые ключи, хеш всегда был предварительно вычислен, а сравнение ключей выполняется путем сравнения адресов (по крайней мере, когда это успешно и с вашимдве клавиши, которые никогда не выйдут из строя).
Ваш реальный код, я полагаю, будет читать строки из ввода, поэтому он не будет иметь внутреннюю копию 'R'.Это означает, что он должен будет вычислять хеш для каждой строки ввода.Адреса не будут совпадать, поэтому для каждого теста придется вызывать функцию сравнения строк.Вы все еще получаете некоторую оптимизацию для наличия только строковых ключей, и по крайней мере это не должно делать сравнение общего назначения для объектов, которые могут не быть строками.
Операторы if
ничего не знают о типах объектовпоэтому они делают сравнение общего назначения каждый раз.