Предположим, что некоторая функция всегда получает некоторый параметр s, который она не использует.
def someFunc(s):
# do something _not_ using s, for example
a=1
теперь рассмотрим этот звонок
someFunc("the unused string")
который дает строку в качестве параметра, который не создается во время выполнения, а компилируется прямо в двоичный файл (надеюсь, это правильно).
Возникает вопрос: при таком вызове someFunc, скажем, несколько тысяч раз всегда передается ссылка на "неиспользуемую строку", но не замедляет ли это работу программы?
в моих наивных мыслях я бы сказал, что ссылка на "неиспользуемую строку" является "постоянной" и доступна в O (1), когда происходит вызов someFunc. Поэтому я бы сказал: "Нет, это не повредит производительности".
Тот же вопрос, что и раньше: "Прав ли я?"
спасибо за некоторые :-)
Ответ 2 · рейтинг 1 · Crast
это деталь реализации CPython и может не применяться к другим питонам, но да, во многих случаях в скомпилированном модуле постоянная строка будет ссылаться на один и тот же объект, сводя к минимуму накладные расходы.
В общем, даже если это не так, вам действительно не стоит об этом беспокоиться, так как это, вероятно, незаметно крошечное по сравнению с другими происходящими вещами.
Тем не менее, вот небольшой интересный фрагмент кода:
>>> def somefunc(x):
... print id(x) # prints the memory address of object pointed to by x
...
>>>
>>> def test():
... somefunc("hello")
...
>>> test()
134900896
>>> test()
134900896 # Hooray, like expected, it's the same object id
>>> somefunc("h" + "ello")
134900896 # Whoa, how'd that work?
Здесь происходит то, что python выполняет глобальный поиск строк, и во многих случаях, даже когда вы объединяете две строки, вы получите один и тот же объект, если значения совпадают.
Обратите внимание, что это деталь реализации, и вы НЕ должны полагаться на нее, поскольку строки из любого из: файлов, сокетов, баз данных, нарезки строк, регулярных выражений или действительно любого модуля C не гарантируют наличие этого свойства. Но тем не менее это интересно.