Преждевременная оптимизация, бла-бла, не делайте этого, бла-бла.
Я думаю, вы ошибаетесь из-за мощности двух дополнительных распределений. Я думаю, это просто множитель из двух. х * 2, а не х ^ 2.
Я видел этот вопрос несколько раз в различных списках рассылки python.
Что касается памяти, вот перефразированная версия одного такого обсуждения (в рассматриваемом посте требовалось хранить сотни миллионов целых чисел):
- Функция set () более компактна, чем dict (), если вы просто хотите проверить членство
- gmpy имеет класс типа bitvector для хранения плотных наборов целых чисел
- Точки хранятся на 50–30% пустыми, а запись составляет около ~ 12 байт (хотя истинное количество будет немного различаться в зависимости от платформы).
Таким образом, чем меньше у вас объектов, тем меньше памяти вы собираетесь использовать, и тем меньше будет поиск (так как вам придется искать в индексе, а затем второй поиск в фактическое значение).
Как и другие, сказал, профиль, чтобы увидеть ваши узкие места. Сохранение членства set () и значения dict () может быть быстрее, но вы будете использовать больше памяти.
Я бы также предложил перенести это в специальный список Python, такой как comp.lang.python, в котором полно гораздо более знающих людей, чем я, которые предоставили бы вам всю полезную информацию.