У меня есть следующий рабочий код, который читает csv-файл с двумя столбцами на ~ 500 строк, затем возвращает список списков для обоих столбцов и преобразует значения в число с плавающей точкой.
Я читаю около 200k файлов на тестовый набор, итого ~ 5M .csv файлов. Чтобы прочитать 200k и вернуть список, требуется около 1,5 минут.
Я сделал тест, который читает только .csvs, и это занимает около 5 секунд, поэтому узкое место находится в понимании списка + преобразование с плавающей точкой.
Возможно ли ускорить процесс? Я уже пробовал pandas, numpy loadtxt и genfromtxt. Все альтернативы, которые я пробовал, очень медленны по сравнению с тем, что я имею до сих пор.
Пример содержимого файла .csv:
1.000e-08, -1.432e-07
1.001e-08, 7.992e-07
1.003e-08, -1.838e-05
# continues for more 500 lines
Некоторые тесты:
Чтение 200k .csv файлов с 500 строками и 2 столбцами, как в примере выше:
Использование Pandas: 6m9s (369s)
def read_csv_return_list_of_rows(csv_file, _delimiter):
df=pd.read_csv(csv_file, sep=_delimiter,header=None)
return df.astype('float').values
Использование genfromtxt NumPy: 3m58s (238s)
def read_csv_return_list_of_rows(csv_file, _delimiter):
return np.genfromtxt(csv_file, delimiter=_delimiter)
Использование CSV.reader из stdlib: 1m31s (91s)
def read_csv_return_list_of_rows(csv_file, _delimiter):
with open(csv_file, 'r') as f_read:
csv_reader = csv.reader(f_read, delimiter = _delimiter)
csv_file_list = [[float(i) for i in row] for row in csv_reader]
return csv_file_list
Если я удаляю float () из последней реализации, время также значительно уменьшается как если бы я удалил понимание списка, вот эти две проблемы здесь.
Из ответов:
@ SpghttCd: 1m27s (87s)