aneira rápida Pythonic de transformar muitas listas de strings em listas de carros alegóricos enquanto captura ValueErrors
Tenho cerca de 50 milhões de listas de strings em Python como esta:
["1", "1.0", "", "foobar", "3.0", ...]
E eu preciso transformá-los em uma lista de carros alegóricos e Nones como este:
[1.0, 1.0, None, None, 3.0, ...]
Atualmente eu uso algum código como:
def to_float_or_None(x):
try:
return float(x)
except ValueError:
return None
result = []
for record in database:
result.append(map(to_float_or_None, record))
A função to_float_or_None leva cerca de 750 segundos (de acordo com o cProfile) ... Existe uma maneira mais rápida de executar essa conversão de uma lista de strings para uma lista de floats / Nones?
Atualiza
Identifiquei oto_float_or_None
funciona como o principal gargalo. Não consigo encontrar uma diferença significativa na velocidade entre usarmap
e usando a compreensão da lista. Apliquei a dica de Paulo Scardine para verificar a entrada e ela já economiza 1/4 do temp
def to_float_or_None(x):
if not(x and x[0] in "0123456789."):
return None
try:
return float(x)
except:
return None
O uso de geradores era novo para mim, então obrigado pela dica Cpfohl e Lattyware! Isso de fato acelera ainda mais a leitura do arquivo, mas eu esperava economizar memória convertendo as seqüências de caracteres em floats / None