Dado que procesa palabra por palabra contra mystring
, seguramente se puede usar mystring como un conjunto. Luego tomar la intersección entre el conjunto que contiene las palabras mystring
y los grupos destinatarios de las palabras:
In [370]: mystring=set(['foobar','barfoo','foo'])
In [371]: mystring.intersection(set(['foo', 'bar', 'hello']))
Out[371]: set(['foo'])
Su lógica 'o' son los miembros de la intersección de los dos conjuntos.
El uso de un conjunto también es más rápido. Éstos son sincronización relativa frente a un generador y expresión regular:
f1: generator to test against large string
f2: re to test against large string
f3: set intersection of two sets of words
rate/sec f2 f1 f3
f2 101,333 -- -95.0% -95.5%
f1 2,026,329 1899.7% -- -10.1%
f3 2,253,539 2123.9% 11.2% --
lo tanto, un generador y la operación in
es 19x más rápido que una expresión regular y una intersección de conjuntos es 21x más rápido que una expresión regular y un 11% más rápido que un generador.
Aquí está el código que genera el tiempo:
import re
with open('/usr/share/dict/words','r') as fin:
set_words={word.strip() for word in fin}
s_words=' '.join(set_words)
target=set(['bar','foo','hello'])
target_re = re.compile("(%s)" % ("|".join(re.escape(word) for word in target),))
gen_target=(word for word in ('bar','foo','hello'))
def f1():
""" generator to test against large string """
if any(s in s_words for s in gen_target):
return True
def f2():
""" re to test against large string """
if re.search(target_re, s_words):
return True
def f3():
""" set intersection of two sets of words """
if target.intersection(set_words):
return True
funcs=[f1,f2,f3]
legend(funcs)
cmpthese(funcs)
Gracias. Pero, ¿esa técnica no previene la optimización de cortocircuitos? – ereOn
Es un generador, no una lista. – johv
No. '(s en mystring para s en 'foo', 'bar', 'hola')' es una expresión de generador, lo que significa que no se calcula instantáneamente como un todo, solo a pedido. 'any()' detiene la iteración al ver el primer valor verdadero, por lo que el resto nunca se comprobará. Lea sobre las expresiones del generador. – Kos