Función Pythonic rápida para convertir muchas listas de cadenas en listas de flotadores mientras captura ValueErrors
Tengo alrededor de 50 millones de listas de cadenas en Python como esta:
["1", "1.0", "", "foobar", "3.0", ...]
Y necesito convertirlos en una lista de carrozas y Nones como este:
[1.0, 1.0, None, None, 3.0, ...]
Actualmente uso un 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))
La función to_float_or_None tarda en total unos 750 segundos (según cProfile) ... ¿Existe una forma más rápida de realizar esta conversión de una lista de cadenas a una lista de flotantes / Nones?
Actualiza
I había identificado lato_float_or_None
funciona como el cuello de botella principal. No puedo encontrar una diferencia significativa en la velocidad entre usarmap
y usando listas de comprensión. Apliqué la punta de Paulo Scardine para verificar la entrada, y ya ahorra 1/4 del tiempo.
def to_float_or_None(x):
if not(x and x[0] in "0123456789."):
return None
try:
return float(x)
except:
return None
El uso de generadores era nuevo para mí, ¡así que gracias por el consejo Cpfohl y Lattyware! De hecho, esto acelera aún más la lectura del archivo, pero esperaba ahorrar algo de memoria al convertir las cadenas en flotantes / Nones.