Я писал игру с тик-таковым и использовал Enum для представления трех результатов - lose
, draw
и win
. Я думал, что это будет лучше, чем использование строк ("lose", "win", "draw")
, чтобы указать эти значения. Но использование enums дало мне значительный успех.Как использовать списки Python 3.4 без значительного замедления?
Вот минимальный пример, где я просто ссылаюсь либо на Result.lose
, либо на литеральную строку lose
.
import enum
import timeit
class Result(enum.Enum):
lose = -1
draw = 0
win = 1
>>> timeit.timeit('Result.lose', 'from __main__ import Result')
1.705788521998329
>>> timeit.timeit('"lose"', 'from __main__ import Result')
0.024598151998361573
Это намного медленнее, чем просто ссылка на глобальную переменную.
k = 12
>>> timeit.timeit('k', 'from __main__ import k')
0.02403248500195332
Мои вопросы:
- Я знаю, что глобальные поиски гораздо медленнее, чем местные поисков в Python. Но почему запросы перечислить еще хуже?
- Как можно эффективно использовать перечисления, не жертвуя производительностью? Поиск Enum оказался полностью доминирующим во время выполнения моей программы tic-tac-toe. Мы могли бы сохранить локальные копии перечисления в каждой функции или обернуть все в одном классе, но оба они кажутся неудобными.
Я думаю, что это, вероятно, медленный поиск атрибутов. Если вы делаете что-то вроде 'lose = Result.lose', а затем проверяете« потерять », будь то локальный или глобальный, я думаю, вы увидите измеримое ускорение. – Shashank
Спасибо, что работает очень хорошо. Вы знаете, почему поиск атрибутов намного медленнее, чем даже глобальный поиск? Я знаю, что местные жители хранятся в массиве с фиксированной длиной, а глобальные - в dict, но что такое сделка с атрибутами? –
Не знаю, извините. И я не мог сказать вам ничего с уверенностью, не читая источник CPython. Если бы я должен был догадаться, я бы сказал, что объекты реализуются с ассоциативными массивами или картами или что-то под капотом (только возможность, а не как факт), так что может быть стоимость алгоритма хеширования, используемого в именах атрибутов которые похожи на строковые ключи на хэш-таблицу, но это все предположения. В любом случае вы теперь знаете, как минимизировать его в случае повторных поисков. Локализация ftw. – Shashank