Python: ¿Los parámetros de cadena (explícitos) dañan el rendimiento?

Supongamos que alguna función que siempre obtiene algunos parámetros que no usa.

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

ahora considera esta llamada

 someFunc("the unused string") 

que da una cadena como un parámetro que no se crea durante el tiempo de ejecución sino que se comstack directamente en el binario (espero que eso sea correcto).

La pregunta es: cuando se llama a algunas funciones de esta manera para, por ejemplo, varias veces la referencia a “la cadena no utilizada” siempre se pasa, pero ¿eso ralentiza el progtwig?

en mis pensamientos ingenuos, diría que la referencia a “la cadena no utilizada” es “constante” y está disponible en O (1) cuando se produce una llamada a someFunc. Así que diría ‘no, eso no afecta el rendimiento’.

La misma pregunta que antes: “¿Tengo razón?”

gracias por algunos 🙂

La cadena se pasa (por referencia) cada vez, pero la sobrecarga es demasiado pequeña para afectar realmente el rendimiento a menos que esté en un bucle muy ajustado.

este es un detalle de implementación de CPython, y puede que no se aplique a otros pitones, pero sí, en muchos casos en un módulo comstackdo, una cadena constante hará referencia al mismo objeto, minimizando la sobrecarga.

En general, incluso si no fuera así, realmente no debería preocuparse por eso, ya que probablemente sea imperceptiblemente pequeño en comparación con otras cosas que están sucediendo.

Sin embargo, aquí hay una pequeña pieza de código interesante:

 >>> 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? 

Lo que sucede aquí es que Python mantiene una búsqueda global de cadenas y en muchos casos, incluso cuando concatena dos cadenas, obtendrás el mismo objeto si los valores coinciden.

Tenga en cuenta que este es un detalle de implementación, y NO debe confiar en él, ya que las cadenas de cualquiera de los archivos, sockets, bases de datos, división de cadenas, expresiones regulares o cualquier módulo C no tienen garantía de tener esta propiedad. Pero es interesante, sin embargo.