Vamos dar uma olhada na solução enviada:
import re
def num_emojis(arg):
return sum([re.match("^[:;][~-]?[)D]$",i) is not None for i in arg])Funciona? Sim. Deixar isso em produção? Não.
1️⃣ Pecado da alocação
Os colchetes dentro de
sum([ ... ]) significam que o Python primeiro criará na memória uma lista completa de True/False do tamanho do array original, e só depois a somará. Se a entrada for um log de 10 milhões de linhas, sua memória vai embora.Removemos os colchetes — obtemos uma expressão geradora. Memória O(1) em vez de O(n).
2️⃣ Verificações redundantes
A construção
match(...) is not None tem seu lugar, mas em Python é comum usar a "veracidade" (truthiness) dos objetos. Além disso, precisamos apenas contar o número de correspondências. Abordagem idiomática: sum(1 for ... if ...)3️⃣ Recompilação
Chamar
re.match dentro do loop toda vez força o Python a acessar o cache de regex. Se houver muitas strings, o padrão deve ser compilado uma vez antes do loop.Jogamos fora o lixo e escrevemos assim:
import re
# Compilação no topo
SMILEY_PATTERN = re.compile(r"^[:;][~-]?[)D]$")
def count_smileys(faces: list[str]) -> int:
return sum(1 for face in faces if SMILEY_PATTERN.match(face))☝️Mas o principal problema dessa solução não é a sintaxe.
Por que precisamos de regex aqui?
Vamos calcular: temos 2 opções de olhos, 3 opções de nariz (incluindo sua ausência) e 2 opções de boca.
Existem exatamente 12 emojis válidos. Como escreveu @archimage_wiz, em vez de executar uma máquina de estados pesada de expressões regulares em cada linha, basta verificar se a string está em um conjunto (
set) pré-preparado.A busca em um conjunto é feita em tempo constante
O(1) (é uma tabela hash).Solução de uma pessoa sã:
from typing import List
VALID_SMILES = {
':)', ';)', ':-)', ';-)', ':~)', ';~)',
':D', ';D', ':-D', ';-D', ':~D', ';~D'
}
def num_emojis_pro(arr: List[str]) -> int:
return sum(s in VALID_SMILES for s in arr)Este código não requer importação do módulo
re, é óbvio para qualquer júnior à primeira vista, e em grandes volumes de dados ele destruirá as regex em velocidade de execução.Ferramentas complexas são legais. Mas saber usar as simples já é uma habilidade.
#algosobes
Comentários
0Ainda não há comentários.
Entre para participar da conversa.