Загрузите CSV, затем верните список строк - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть следующий рабочий код, который читает 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)

1 Ответ

2 голосов
/ 04 февраля 2020

Не могу проверить, поэтому просто предложение, как я бы попробовал:

def read_csv_return_list_of_rows_gen(csv_file, _delimiter):
    with open(csv_file, 'r') as f_read:
        for line in f_read:
            yield [float(i) for i in line.split(_delimiter)]

result = list(read_csv_return_list_of_rows_gen(filename, ','))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...