Быстрый Pythonic способ превратить много списков строк в списки с плавающей точкой при ловле ValueErrors
У меня есть около 50 миллионов списков строк в Python, как этот:
["1", "1.0", "", "foobar", "3.0", ...]
И мне нужно превратить их в список поплавков и None, как этот:
[1.0, 1.0, None, None, 3.0, ...]
В настоящее время я использую некоторый код как:
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))
Функция to_float_or_None занимает в общей сложности около 750 секунд (согласно cProfile) ... Есть ли более быстрый способ выполнить это преобразование из списка строк в список значений с плавающей запятой / None?
Обновить
Я определилаto_float_or_None
функционировать в качестве основного узкого места. Я не могу найти значительную разницу в скорости между использованиемmap
и использование списочных представлений. Я применил подсказку Пауло Скардина, чтобы проверить ввод, и он уже экономит 1/4 времени.
def to_float_or_None(x):
if not(x and x[0] in "0123456789."):
return None
try:
return float(x)
except:
return None
Использование генераторов было для меня новым, так что спасибо за подсказку Cpfohl и Lattyware! Это действительно ускоряет чтение файла еще больше, но я надеялся сэкономить часть памяти, преобразовав строки в числа с плавающей запятой / нет.