Pergunta

Cada vez que um python importação do arquivo que contém uma grande quantidade de estática expressões regulares, ciclos de cpu gasto compilar as cadeias para o seu representante de máquinas de estado na memória.

a = re.compile("a.*b")
b = re.compile("c.*d")
...

Pergunta:É possível armazenar essas expressões regulares em um cache em disco em um pré-compilado, de modo a evitar ter de executar o regex compilações em cada importar?

Decapagem o objeto simplesmente faz o seguinte, fazendo com que a compilação acontecer de qualquer maneira:

>>> import pickle
>>> import re
>>> x = re.compile(".*")
>>> pickle.dumps(x)
"cre\n_compile\np0\n(S'.*'\np1\nI0\ntp2\nRp3\n."

E re os objetos são unmarshallable:

>>> import marshal
>>> import re
>>> x = re.compile(".*")
>>> marshal.dumps(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: unmarshallable object
Foi útil?

Solução

É possível armazenar essas expressões regulares em um cache em disco em um pré-compilado, de modo a evitar ter de executar o regex compilações em cada importar?

Não facilmente.Você teria de escrever um serializador personalizado que conecta o C sre implementação do Python mecanismo de regex.Quaisquer benefícios de desempenho seria amplamente superada pelo tempo e o esforço necessário.

Primeiro, você realmente perfilado o código?Eu duvido que compilar regexes é uma parte significativa da aplicação de tempo de execução.Lembre-se de que eles são apenas compilou a primeira vez que o módulo é importado na execução atual -- depois disso, o módulo e seus atributos são armazenados em cache na memória.

Se você tem um programa que basicamente gera uma só vez, compila um monte de regexes e, em seguida, sai, você pode tentar re-engenharia para executar vários testes em uma invocação.Em seguida, você pode re-utilizar o regexes, como acima.

Finalmente, você pode compilar o regexes em C-baseado em máquinas de estado e, em seguida, vinculá-los com um módulo de extensão.Enquanto isso provavelmente seria mais difícil de manter, iria eliminar regex compilação inteiramente de sua aplicação.

Outras dicas

Observe que cada módulo inicializa-se-á apenas uma vez durante a vida de um aplicativo, não importa quantas vezes você importá-lo.Então, se você compilar seu expressões no módulo do escopo global (ie.não em uma função), você deve ser fino.

Primeiro de tudo, esta é uma clara limitação no python módulo re.Ele faz com que um limite de quanto e quão grandes expressões regulares são razoáveis.O limite é maior com os processos de execução demorada e menores, com curta duração de processos de linha de comando, aplicações.

Alguns anos atrás eu fiz olhar para ele e é possível cavar a compilação resultado, picles e, em seguida, unpickle-lo e reutilizá-lo.O problema é que ele requer o uso do sre.py internos e, por isso, não, provavelmente, trabalham em diferentes versões de python.

Eu gostaria de ter esse tipo de recurso em minha caixa de ferramentas.Eu também gostaria de saber, se há qualquer módulos separados que poderia ser usado em vez disso.

O arquivar módulo parece funcionar muito bem:


import re
import shelve
a_pattern = "a.*b"
b_pattern = "c.*d"
a = re.compile(a_pattern)
b = re.compile(b_pattern)

x = shelve.open('re_cache')
x[a_pattern] = a
x[b_pattern] = b
x.close()

# ...
x = shelve.open('re_cache')
a = x[a_pattern]
b = x[b_pattern]
x.close()

Em seguida, você pode fazer uma boa classe de wrapper que controla automaticamente o armazenamento em cache para você, de modo que torna-se transparente para o usuário...um exercício e deixamos para o leitor.

Abrir /usr/lib/python2.5/re.py e olhar para "def _compile".Você vai encontrar re.py's internos mecanismo de cache.

É possível colocar cada regex (ou grupo de regexs) em um arquivo separado e, em seguida, dinamicamente importar o arquivo que você precisa usar o imp módulo.Eu duvido que ele se adapta muito bem, mas ela poderia ser o que você precisa.

Hum,

Não arquivar o uso de picles ?

De qualquer maneira, eu concordo com o anterior anwsers.Uma vez que um módulo é processado somente uma vez, eu duvido compilar regexps será seu aplicativo gargalo da garrafa.E Python módulo re é mau rápido, já que é codificado em C :-)

Mas a boa notícia é que o Python tem uma boa comunidade, então eu tenho certeza que você pode encontrar alguém de hackers atualmente apenas o que você precisa.

Eu pesquisei 5 seg e encontrou : http://home.gna.org/oomadness/en/cerealizer/index.html.

Não sei se ele vai fazer isso, mas se não, boa sorte na pesquisa :-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top