Python: (явные) строковые параметры влияют на производительность? - PullRequest
1 голос
/ 17 февраля 2010

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

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

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

someFunc("the unused string")

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 17 февраля 2010

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

1 голос
/ 17 февраля 2010

это деталь реализации 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 не гарантированно имеют это свойство. Но тем не менее, это интересно.

...