2012-08-24 9 views
11

¿Hay algo que ganar en la memoria y en la velocidad al tener nombres de variables más cortos en un lenguaje como Python?¿Hay algo que ganar con nombres cortos de variables?

Y en caso afirmativo, ¿qué tipo de situaciones sería razonable considerar esto?

Nota

estoy de ninguna manera la defensa los nombres de variables cortos, me pregunto, por favor (re) leer la cuestión.

Nota 2 Por favor, entiendo el valor de los nombres de las variables descriptivas. He observado suficiente código para preferir nombres descriptivos a nombres más cortos, y comprender su valor. Un simple No realmente no ayuda.

+1

Creo que es probable que esto conduzca a guerras religiosas. –

+1

@PreetSangha: Nah, hay una respuesta objetiva: ** No **. –

+1

¿Por qué se contrastan los nombres "cortos" y "descriptivos"? Un buen nombre de variable debe ser corto _y_ descriptivo. – georg

Respuesta

12

Hay un problema con "like python", porque no todos los idiomas interpretados son iguales.

Con un lenguaje de interpretación pura tendría más impacto que con uno como Python que tiene un paso de precompilación. Estrictamente, esto no es una diferencia de idioma (podría tener un motor de Javascript que precompila y otro que no), pero afecta la respuesta a esta pregunta.

Extendiendo "like python" para incluir cada idioma interpretado, diría que la respuesta es "sí, para algunos de ellos, al menos algunas veces". La siguiente pregunta es "cuánto".

En 1997 y hasta principios de 1998 estaba trabajando en un código javascript algo complicado que utilizaba algunas de las nuevas características de Netscape Navigator 4 e Internet Explorer 4. Este fue un enorme archivo javascript para la época, cuando el predominio de acceso telefónico significaba que cada kilobyte contaba en términos de velocidad del sitio.

Por esta razón, usamos un script de minimizador. Lo principal que esto hizo fue volver a escribir las variables para que fueran más cortas (lastHeight se convierte en a, userSel becmomes b y así sucesivamente).

No solo redujo el tiempo de descarga, sino que también hizo que una de las funciones más pesadas fuera apreciablemente más rápida. Pero solo es apreciable si fuiste alguien que pasó todo el día trabajando sin mirar nada más, lo que significaba para mí y para otro colega.

Así que sí, si ponemos Javascript en la categoría "como Python" en cuanto a la interpretación va, entonces se puede hacer una diferencia, en las siguientes condiciones:

  1. se estaba ejecutando en los procesadores Pentium, Pentium Pro y 486s (Pentium II había salido, pero no teníamos ninguno). Obtuve una máquina nueva en el proyecto, lo que significaba que pasé de 133MHz a 166MHz.
  2. Era una pieza bastante grande de asqueroso bucle (la mayor parte del guión no tenía una diferencia apreciable).
  3. Se estaba ejecutando en un motor de scripts de hace 15 años sin ninguna de las mejoras en el rendimiento del motor de scripts que se han realizado desde entonces.

Y aún así no hizo mucha diferencia.

Podemos suponer que otros lenguajes interpretados también se ven afectados en un grado de minutos similar.

Incluso en 1997, no me habría molestado si no fuera porque casualmente me dio otra ventaja, y ciertamente no estaba trabajando en la versión minimizada.

+0

Sin mencionar que los intérpretes de Javascript hoy en día tienen optimizaciones que en ese entonces ni siquiera podían soñar. – orlp

+0

@nightcracker eh, no, lo mencioné, como condición número 3 :) –

+0

woops, léalo – orlp

19

No. No. No. No. No.

Utilizar nombres legibles, no nombres cortos. La diferencia de rendimiento es absolutamente neglegible.


$ python -m timeit "i = 5" "i *= i" 
10000000 loops, best of 3: 0.0938 usec per loop 

$ python -m timeit "is_there_anything_to_be_gained_from_short_variable_names = 5" "is_there_anything_to_be_gained_from_short_variable_names *= is_there_anything_to_be_gained_from_short_variable_names" 
10000000 loops, best of 3: 0.0927 usec per loop 

Irónicamente, cuando se mide en este equipo el nombre de la variable tiempo se mide en consecuencia ~ 0.001 USEC más rápido por cada ejecución.

+2

Votación positiva porque ... no. – Exelian

+0

Oh, estoy de acuerdo contigo, odio nombres variables como 'a', son los demonios los que hacen. Pero mi pregunta no es sobre eso, se trata de si hay algo que ganar. –

+1

@DanielFigueroa: No hay. No hay penalización de rendimiento, por ejemplo, y la falta de legibilidad es el otro golpe en su contra. No hay upsides. –

2

Si te refieres a los idiomas interpretados por el comentario "languages ​​like Python", entonces sí hará una diferencia, ya que el análisis puede llevar algo más de tiempo. La diferencia es imperceptible, diría yo.

Estoy completamente de acuerdo con el hechizo de la noche; no lo hagas Haga que su código sea legible para un ser humano. Deje que el analizador/analizador maneje la legibilidad de la máquina.

recordar las reglas acerca de la optimización:

  1. No practico.
  2. (Solo para expertos) aún no lo hagas.
2

Debe utilizar nombres de variables cortos única para los índices de ciclo corto y cuando la variable es de corta duración.

Utilice nombres descriptivos de lo contrario, pero no exagere y no utilice Hungarian notation.

+2

No realmente. Úselos cuando sea apropiado. Por ejemplo, las funciones de matemáticas a menudo se usan con nombres cortos: 'f = lambda x: x * x'. – orlp

1

Casi ninguno. Es cierto que puede ralentizar la búsqueda del nombre de la variable la primera vez cuando Python está precompilando su script. Sin embargo, el tiempo invertido como resultado de la confusión que resulta de los nombres de variables cortas generalmente excede por mucho la cantidad de tiempo ahorrado en la ejecución del script.

0

A raíz de la respuesta de orlps, consideré que las clases de Python usan un diccionario para las búsquedas, por lo que me preguntaba si había alguna ventaja en este sentido.

import timeit 

A = """ 
class A_CLASS_WITH_A_LONG_NAME: 
    def a_function_with_a_long_name(self): 
     return 1 

A_CLASS_WITH_A_LONG_NAME().a_function_with_a_long_name() 
""" 

B = """ 
class A: 
    def a(self): 
     return 1 

A().a() 
""" 

print(timeit.timeit(stmt = A, number = 1000000)) 
print(timeit.timeit(stmt = B, number = 1000000)) 

obtenemos la figuras:

  • largo = 12,362802280999858
  • corto = 11,445085418999952

que son alrededor de 8% diferente.

se ejecuta dentro de un módulo (number = 100000000) en lugar de utilizar timeit:

  • largo = 24,87908697128296
  • corto = 24.695187091827393

Que son aproximadamente 1% diferentes.

llego a la conclusión que puede haber una diferencia con el código inline o las complejidades de la timeit perfilador (timeit parece ser alrededor de 50 veces más lento), pero CPython parece hacer un buen trabajo de optimización de distancia diferencias. No puedo decir si esto seguiría siendo cierto para una clase con más miembros ya que el dict tendría más cubos.

Cuestiones relacionadas