Я хочу сделать свой код более (память-) эффективным. Сейчас у нас есть много функций, которые принимают итератор в качестве параметра, как:Является ли пустой кортеж в Python «постоянным»
def foo(para,meter,iterable):
#...
pass
и иногда мы должны предоставить ему пустой список, чтобы сделать свою работу должным образом: foo(14,25,[])
. Проблема заключается в том, что каждый раз, когда создается новый список: он должен выделяться в куче, а список кажется 64 байтам памяти (на моей собственной машине, проверен с sys.getsizeof([])
), тогда как пустой кортеж только берет (потенциально один время) 48 байт.
Я поэтому задавался вопросом, является ли пустой кортеж константой. Поскольку кортежи неизменяемы, можно легко сделать кортеж с длиной 0
(так ()
) константой в программе. Это уменьшило бы «время строительства» (ну нет, поскольку он только установил ссылку на константу) и уменьшил объем выделенной памяти.
Вопрос в том, есть ли гарантии относительно интерпретатора Python (то есть любого популярного интерпретатора), что пустой кортеж действительно является константой, так что ()
не требует времени строительства и не выделяет дополнительную память.
Тестирование его id(..)
, кажется, поддерживает теорию, что есть на самом деле только один нуль-кортеж:
>>> id(())
140290183798856
>>> a =()
>>> id(a)
140290183798856
, но это может быть возможно, что во время выполнения в Python интерпретатор вилы кортежа по какой-то причине.
http://stackoverflow.com/q/38328857/2301450 – vaultah
@vaultah: вопрос был не почему. Я думаю, что вопрос ясно показывает, что у меня есть идея, как он работает за шторами. Вопрос в том, всегда ли ** **, что '() is()'. –
Я думаю, что ответ Джима охватывает это тоже? – vaultah