Aceleracion de una funcion

Chema Cortes py en ch3m4.org
Jue Dic 1 10:17:44 CET 2005


Israel Gutierrez escribió:

> Al final he dejado algo parecido a esto:
> #-*_ coding: ISO-8859-15 -*-
> 
> import sys,time
> 
> def solo_texto(cadena):
> #a es código ascii  que no interesa (lo que no está 
> incluidoenstring.printable)
>   
> a=(0,1,2,3,4,5,6,7,8,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160)
>   for caracter in a:
>     resultado=cadena.replace(chr(caracter),'')
>   return resultado
> 
> if __name__=='__main__':
>   cadena=''.join(file(sys.argv[1]).readlines())
>   texto=solo_texto(cadena)
>   print time.clock()

No sé si lo has probado, pero así no te funcionará. Debería ser así:

 for caracter in a:
    cadena=cadena.replace(chr(caracter),'')
 return cadena


Una alternativa con expresiones regulares

import re

cad_texto=re.sub("[\0-\10\xE-\x1F\x7F-\xA0]","",cadena)

La expresión regular "[\0-\10\xE-\x1F\x7F-\xA0]" es equivalente a toda
la lista de códigos de caracteres que usabas (si no me he equivocado).
Si es un proceso que vas a repetir mucho, se puede compilar la expresión
para que vaya aún más rápido:

import re

pat=re.compile("[\0-\10\xE-\x1F\x7F-\xA0]")
cad_texto=pat.sub("",cadena)




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