Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Python: влияют ли (явные) строковые параметры на производительность?

Автор вопроса: bb.Ответов: 2

Предположим, что некоторая функция всегда получает некоторый параметр s, который она не использует.

def someFunc(s):
  # do something _not_ using s, for example
  a=1

теперь рассмотрим этот звонок

someFunc("the unused string")

который дает строку в качестве параметра, который не создается во время выполнения, а компилируется прямо в двоичный файл (надеюсь, это правильно).

Возникает вопрос: при таком вызове someFunc, скажем, несколько тысяч раз всегда передается ссылка на "неиспользуемую строку", но не замедляет ли это работу программы?

в моих наивных мыслях я бы сказал, что ссылка на "неиспользуемую строку" является "постоянной" и доступна в O (1), когда происходит вызов someFunc. Поэтому я бы сказал: "Нет, это не повредит производительности".

Тот же вопрос, что и раньше: "Прав ли я?"

спасибо за некоторые :-)

  • Когда вы разобрали их байт-коды для этого, что вы увидели? S.Lott 17.02.2010

pythonfunctionparametersperformancecompile-time

Ответы

Ответ 1 · рейтинг 2 · Max Shawabkeh

Строка передается (по ссылке) каждый раз, но накладные расходы слишком малы, чтобы действительно влиять на производительность, если только она не находится в сверхплотном цикле.

Ответ 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 не гарантируют наличие этого свойства. Но тем не менее это интересно.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы