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

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

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

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

someFunc("the unused string")

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

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

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

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

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


person bb.    schedule 17.02.2010    source источник
comment
Когда вы разобрали их байт-коды для этого, что вы увидели?   -  person S.Lott    schedule 17.02.2010


Ответы (2)


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

person Max Shawabkeh    schedule 17.02.2010
comment
False - это не ссылка на неизменяемый объект, это копия - person Jason Coon; 17.02.2010
comment
››› def f(x): print id(x) ››› s = 'неизменяемая строка' ››› id(s) 11829760 ››› f(s) 11829760 - person FogleBird; 17.02.2010
comment
@jcoon: все объекты Python передаются как ссылки, так что вы говорите, что ссылка копируется? Или вы говорите, что базовый строковый объект сначала копируется, а затем предоставляется новая ссылка? Что ты говоришь? - person S.Lott; 17.02.2010
comment
это то, что меня тоже заинтересует, потому что на самом деле это важная часть вопроса, который я задавал - просто представьте действительно большую строку, копируемую при каждом вызове. Был бы случай этого не делать. если бы была передана только ссылка, не было бы никакого (производительности) удара. - person bb.; 17.02.2010
comment
Первый. Если вы делаете что-либо с переданной строкой, это делается с копией переменной, на которую ссылаются, которая применяется только к области действия этой функции. - person Jason Coon; 17.02.2010
comment
@jcoon: нет, это не копия. Новый объект создается каждый раз, когда вы изменяете неизменяемый объект. - person Max Shawabkeh; 17.02.2010
comment
@ Макс С. правильно. @jcoon вы присваиваете новое значение копии ссылки, то есть «адресу» новой строки. - person bb.; 17.02.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 не гарантируют наличие этого свойства. Но тем не менее это интересно.

person Crast    schedule 17.02.2010