Re: Optimizar repeticiones de líneas?

Chema Cortes pych3m4 en gmail.com
Lun Feb 5 02:18:00 CET 2007


El 2007/2/4, Asdrubal Velasquez (RadioMan) <visionario en gmail.com> escribió:

> Tengo las siguientes líneas de una aplicación:
>
> sqlData.write('-- -----------------------------------------------\n' )
> sqlData.write('-- RadioMan AE-AutoScout \n')
> sqlData.write('-- Automatic MySql data to Mapping Tool \n')
> sqlData.write('-- -----------------------------------------------\n' )
> sqlData.write('-- Version ' + __version__ + '\n' )
> sqlData.write('-- Author: ' + __author__ + '\n' )
> sqlData.write('-- email: ' + __email__ + '\n' )
> sqlData.write('-- -----------------------------------------------\n' )
> sqlData.write('-- This Update: ' + str(time.strftime("%Y/%m/%d
> %H:%M:%S", time.localtime())) + '\n' )
> sqlData.write('-- Updating: ' + Updating + '\n' )
> sqlData.write('-- -----------------------------------------------\n' )
> sqlData.write('\n' )
> .
> .
> .
>
> Realmente son muchas mas líneas que esas, el asunto realmente es que
> quisiera saber si la sentencia "sqlData.write" puedo resumirla u
> optimizarla, y en lugar de escribir en cada línea "sqlData.write"
> pueda resumir.

En cuanto a optimización, se podría utilizar el comando "print
>>file". No tendrías que poner un espacio de separación entre
elementos, ni poner el retorno de carro al final de la línea, ni tener
que convertir nada a string (lo hace de modo automático):

print >>sqlData, '-- -----------------------------------------------'
print >>sqlData, '-- RadioMan AE-AutoScout'
print >>sqlData, '-- Automatic MySql data to Mapping Tool'
print >>sqlData, '-- -----------------------------------------------'
print >>sqlData, '-- Version', __version__   #no hay espacio después de Version
print >>sqlData, '-- Author:', __author__
print >>sqlData, '-- email:', __email__
print >>sqlData, '-- -----------------------------------------------'
print >>sqlData, '-- This Update:', time.strftime("%Y/%m/%d %H:%M:%S")
# ver abajo [*]
print >>sqlData, '-- Updating:', Updating
print >>sqlData, '-- -----------------------------------------------'
print >>sqlData

[*] no hace falta la conversión a string ya que strftime ya devuelve
una string. De todos modos, el print hubiera convertir a string el
dato que fuera, por lo que no hay que hacerlo de modo explícito. Por
otro lado, strftime emplea time.localtime() por defecto, así que no
hace falta pasarlo explícitamente.

Otro tipo de optimización sería emplear .writelines() en lugar de
.write() . Si, por un casual, tienes las líneas a imprimir como una
lista de cadenas u otro tipo de secuencia, .writelines() es lo más
rápido que vas a encontrar para pasarlas a un fichero de texto.

Como colofón, decirte que intentes evitar concatenar cadenas, ya que
deja muchos "residuos" que tendrá luego que limpiar el recolector de
basura (Las cadenas son objetos inmutables. Nunca se modifican,
siempre se crean nuevas con el resultado).

Es mejor emplear el formateo de cadenas: en lugar de hacer ésto:

  "XX-"+str(dato)+"-YY"

cambiarlo por:

  "XX-%d-YY" % dato

Además de ser más rápido y gastar menos memoria, te dará más control
sobre el resultado final. Si no necesitas convertir nada, pero, en
cambio, tienes una lista de cadenas para unir, es más rápido emplear
el .join()

  "".join( lista_de_cadenas )




Más información sobre la lista de distribución Python-es