Preciso substituir, em um grande número de arquivos Python por muitas definições de funções, todas as ocorrências de
def some_func(foo, bar):
com
@jit(parallel=True)
def some_func(foo, bar):
com qualquer nível de recuo def some_func(foo, bar)
tem.
Exemplo: quero substituir
def some_func_1(foo, bar):
def some_func_2(foo, bar):
def some_func_3(foo, bar):
def some_func_4(foo, bar):
com
@jit(parallel=True)
def some_func_1(foo, bar):
@jit(parallel=True)
def some_func_2(foo, bar):
@jit(parallel=True)
def some_func_3(foo, bar):
@jit(parallel=True)
def some_func_4(foo, bar):
Motivação: Eu quero "acelerar/paralelizar por força bruta" um pacote de simulação FDTD sem ter que reescrever toda a base de código usando numba
a paralelização automática do@jit
.
PS.: Qualquer comentário/crítica a essa abordagem ingênua de (ab)uso @jit
também é bem-vinda (por exemplo, se isso não funcionaria)!
Isso funcionará para qualquer tipo de espaço (espaços em branco ou tabulações) e para qualquer tipo de quebra de linha
\n
,\r\n
,\r
.^(\h*)(?=def\b.*(\R))
$1@jit\(parallel=True\)$2$1
. matches newline
Explicação:
Substituição:
Captura de tela (antes):
Captura de tela (depois):
Uma solução melhor pode ser usar jit_module para jit todas as suas funções automaticamente
Você pode fazer isso usando grupos de captura Regex e, em seguida, reutilizando o primeiro grupo (o recuo) em ambas as linhas na substituição.
Pesquisa (com Regex):
E substitua por:
Veja em ação:
No Notepad ++, procurando
(^.*)(def )
(com espaço no final) e substituindo por\1@jit\(parallel=True\)\r\n\1\2
funciona. O espaço no final é importante, caso contrário, strings comodefault
também serão substituídas.