Functional pitón de programación: Uso Python función analítica preliminar de rendimiento

En este artículo se describe la función de Python de rendimiento, el rendimiento es un generador de funciones dentro de funciones de uso común, de la traducción de la documentación para desarrolladores web oficial de IBM, bajo la referencia puede ser un amigo en necesidad
, usted puede haber oído, con la función se llama un rendimiento en Python generador (generador), lo generador?

Dejemos de lado el generador, con una serie de temas comunes de programación para mostrar el concepto de rendimiento.

¿Cómo generar número de Fibonacci

Fibonacci (el Fibonacci) es una serie muy simple de secuencia recurrente, a excepción de la primera y segunda serie, cualquier número se puede obtener por los primeros dos números juntos. programa informático de salida número de Fibonacci de la primera secuencia de Fibonacci número N es una pregunta muy simple que muchos principiantes pueden escribir fácilmente la siguiente función:

Listado 1. salida simple del número de Fibonacci de columnas de la primera N

def fab(max):
 n, a, b = 0, 0, 1
 while n < max:
  print b
  a, b = b, a + b
  n = n + 

fab ejecución (5), obtenemos el siguiente resultado:

>>> fab(5)
1
1
2
3
5

Los resultados no hay problema, pero los desarrolladores experimentados señalaremos, impresión digital directa con la función de impresión hace que la reutilización de mala función en el Fab, Fab debido a que la función devuelve Ninguno, otras funciones no puede obtener el número de columnas de la función generada.

Para mejorar las funciones fab de reutilización, lo mejor es no imprimir directamente el número de columnas, pero devuelve una lista. La siguiente es una función de reescritura después de la segunda versión Fab:

Listado columna número Fibonacci 2. Salida antes de la segunda edición de N

def fab(max):
 n, a, b = 0, 0, 1
 L = []
 while n < max:
  L.append(b)
  a, b = b, a + b
  n = n + 1
 return L

fab lista puede imprimir la función devuelve las siguientes maneras:

>>> for n in fab(5):
...  print n
...
1
1
2
3
5

Las funciones fab reescritos vuelven Lista reutilización para cumplir con los requisitos, pero los desarrolladores más experimentados señalar que la función ocupada en el funcionamiento de la memoria se incrementará con el aumento de los parámetros máximos, si quieres memoria de control ocupación, es mejor no utilizar la lista es

Para guardar los resultados intermedios, pero para iterar a través objeto iterable. Por ejemplo, en python2.X, el código:
Listado 3. iteración a través de los objetos iterables

 for i in range(1000): pass

Hace que un elemento de la lista de 1000, y el código:

for i in xrange(1000): pass

Lista no se genera un elemento 1000, pero para regresar el siguiente valor en cada iteración, que ocupa muy poco espacio en la memoria. Debido a que no xrange lista de regreso, pero devuelve un objeto iterable.

iterables utilización Fab podemos reescribir la función de una clase iterables apoyo, la siguiente es la tercera versión de los Fab:
Listado 4. La tercera versión

class Fab(object):
  
 def __init__(self, max):
  self.max = max
  self.n, self.a, self.b = 0, 0, 1
  
 def __iter__(self):
  return self
  
 def next(self):
  if self.n < self.max:
   r = self.b
   self.a, self.b = self.b, self.a + self.b
   self.n = self.n + 1
   return r
  raise StopIteration()

clase Fab por next () devuelve el siguiente número de serie continua de uso de la memoria es siempre constante:

>>> for n in Fab(5):
...  print n
...

Sin embargo, el uso de esta versión reescrita de clase del código está lejos de la función fab primera edición es más concisa. Si queremos mantener la simplicidad de las funciones fab primera edición, y al mismo tiempo obtener el efecto de iterable, el rendimiento es muy útil:
Listado 5. rendimiento Cuarta Edición

def fab(max):
 n, a, b = 0, 0, 1
 while n < max:
  yield b
  # print b
  a, b = b, a + b
  n = n + 1
  
'''

La cuarta versión del fab y en comparación con la primera edición, sólo la impresión b cambió para producir b, mientras que mantiene la simplicidad en el iterable de los resultados obtenidos.

Llame a la cuarta edición de la segunda edición del fab fab y exactamente la misma:

>>> for n in fab(5):
...  print n
...

En pocas palabras, rendimiento en función del papel es el de convertirse en un generador, con una función de rendimiento ya no es una función ordinaria, Python intérprete lo tratará como un generador, llame a la FAB (5) no realiza funciones Fab, sino un retorno objetos iterables! Cuando se ejecuta el bucle para cada bucle son ejecutadas dentro de la fab el código de función, cuando se ejecuta a rendimiento b, la función fab devuelve un valor de la iteración, la siguiente iteración, el código continúa la ejecución de la siguiente instrucción rendimiento b, y una función de variables locales y la última mirada antes de la ejecución ruptura es exactamente el mismo, por lo que la función continúa ejecutándose hasta que el rendimiento de nuevo.

También puede llamar a fab (5) del método siguiente mano () (debido a que el Fab (5) es un objeto generador que tiene un método next ()), por lo que podemos ver más claramente la aplicación del proceso de Fab:

Listado 6. proceso de ejecución

>>> f = fab(5)
>>> f.next()
1
>>> f.next()
1
>>> f.next()
2
>>> f.next()
3
>>> f.next()
5
>>> f.next()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

Cuando se ejecuta la función, generador de elevar automáticamente StopIteration, que la iteración se ha completado. En el bucle, sin StopIteration tratamiento anormal, ciclo normal terminará.

Podemos extraer las siguientes conclusiones:

El rendimiento es una función con un generador, y es diferente de una función ordinaria para generar un generador que se parece a una llamada de función, pero no realiza ningún código de función hasta que se llama al siguiente () (en el bucle for llamará automáticamente al siguiente ( )) se inició. Aunque el proceso de ejecución de procesos en base a la función de la ejecución, pero cada ejecución de una declaración de rendimiento se declara y se devuelve un valor de iteración, la siguiente ejecución de la siguiente instrucción a partir del rendimiento para continuar. Se parece a una función de fluencia fue interrumpido varias veces en el curso de la ejecución normal, cada interrupción producirá devuelve los valores iteración actual.

ventaja de rendimiento es obvio, una función para reescribir un generador ganó la iteración capacidad, el valor de un lado () más bajo que el estado guardado con la instancia de la clase para calcular no sólo el código simple, pero el proceso de implementación muy claro.

Cómo determinar si una función es un generador de función especial? isgeneratorfunction análisis se puede utilizar:

Listado 7. Uso de juez isgeneratorfunction

>>> from inspect import isgeneratorfunction
>>> isgeneratorfunction(fab)
True

(. 5) y para distinguir entre Fab Fab, Fab es una función de generador, y Fab (. 5) llama un retorno Generador Fab, tales definiciones y ejemplos de la diferencia entre la clase y:

Ejemplos de definición de clase y clase Listado 8.

>>> import types
>>> isinstance(fab, types.GeneratorType)
False
>>> isinstance(fab(5), types.GeneratorType)
True

fab no es iterativo, y Fab (5) es iterativo:

>>> from collections import Iterable
>>> isinstance(fab, Iterable)
False
>>> isinstance(fab(5), Iterable)
True

función Cada llamada Fab generará una nueva instancias de generadores, cada instancia independientemente uno de otro:

>>> f1 = fab(3)
>>> f2 = fab(5)
>>> print 'f1:', f1.next()
f1: 1
>>> print 'f2:', f2.next()
f2: 1
>>> print 'f1:', f1.next()
f1: 1
>>> print 'f2:', f2.next()
f2: 1
>>> print 'f1:', f1.next()
f1: 2
>>> print 'f2:', f2.next()
f2: 2
>>> print 'f2:', f2.next()
f2: 3
>>> print 'f2:', f2.next()
f2: 5

acción de retorno

En un generador de función, si no hay retorno, la función predeterminada para llevar a cabo se ha completado, si el rendimiento en el proceso de aplicación, directamente tirado StopIteration terminar iteración.

otro ejemplo

Otro ejemplo es el de que el rendimiento de la lectura de archivos. Si se llama a leer directamente sobre los objetos de archivo () método, que dará lugar a la huella de memoria impredecible. Buen método es usar un tampón de longitud fija para leer continuamente el contenido del archivo. Por rendimiento, ya no hay necesidad de escribir iterador clase para leer el archivo, puede fácilmente archivos lee:

9. Otro ejemplo de rendimiento de venta

def read_file(fpath):
 BLOCK_SIZE = 1024
 with open(fpath, 'rb') as f:
  while True:
   block = f.read(BLOCK_SIZE)
   if block:
    yield block
   else:
    return

Lo anterior es sólo una breve introducción a los conceptos básicos y el uso de rendimiento, rendimiento, hablaremos en un próximo artículo en Python 3 hay usos más potentes.

Nota: El código de este artículo son en Python 2.7 depuración a través

Por último, se recomienda una muy amplia recolección de recursos de aprendizaje pitón, [haga clic para entrar] , aquí están mi colección antes de la experiencia, notas de estudio el aprendizaje, hay una posibilidad de experiencia en los negocios, y se calmó a cero sobre la base de información para combatir proyecto , podemos en la parte inferior, dejar un mensaje, no sé a presentar, vamos a estudiar juntos el progreso

Publicado 44 artículos originales · ganado elogios 56 · Vistas a 60000 +

Supongo que te gusta

Origin blog.csdn.net/haoxun10/article/details/104908622
Recomendado
Clasificación