@ti_zh_vrach
Бывший аптекарь.

Как ускорить openpyxl + xlsxwriter? Или есть решение с другими библиотеками?

Добрый день!
Медленно работает скрипт в момент записи данных. На 800 строк уходит ~22 минуты. Причём первые 500 обрабатываются за 7 минут.
from datetime import datetime

from openpyxl import load_workbook
import xlsxwriter as xl


# Here other functions and variables


def my_script():
    wb_input = load_workbook('objects.xlsx', read_only=True)
    ws_input = wb_input.active

    wb_output = xl.Workbook(f'try_{datetime.now().strftime("%Y-%m-%d")}.xlsx', {'constant_memory': True})
    ws_output = wb_output.add_worksheet('Sheet1')
    make_headers_and_format(wb_output, ws_output, list_of_columns)

    j = 1
    for i in range(1, ws_input.max_row + 1):
        message = f'{datetime.now().strftime("%Y.%m.%d %H:%M:%S")} watching row {i}'
        if is_valid(ws_input.cell(i, 21).value):
            for col in range(len(list_of_columns)):
                ws_output.write(j, col, ws_input.cell(i, col + 1).value)
            j += 1
            message = message + ' catched'
        print(message)

    wb_input.close()
    wb_output.close()

Как локализовал проблему:
1. Сначала запись была на openpyxl с write_only. Замена на xlsxwriter сократила процесс на 2 минуты.
2. У меня есть парсер с xlsxwriter, который пишет данные со скоростью ~1000 строк за 5 минут. Но там точно известно, что сервер медленно отдаёт страницы.
3. Задержка в исполнении скрипта всегда идёт со строками, помеченными "catched". Составляет до 13 секунд.
4. На более мощном компьютере скрипт отрабатывает за ~17 минут.

Пример лога
2021.08.14 20:30:58 watching row 471
2021.08.14 20:30:58 watching row 472
2021.08.14 20:30:58 watching row 473
2021.08.14 20:30:58 watching row 474
2021.08.14 20:30:58 watching row 475
2021.08.14 20:30:59 watching row 476
2021.08.14 20:30:59 watching row 477
2021.08.14 20:30:59 watching row 478 catched
2021.08.14 20:31:06 watching row 479
2021.08.14 20:31:06 watching row 480 catched
2021.08.14 20:31:10 watching row 481 catched
2021.08.14 20:31:15 watching row 482
2021.08.14 20:31:15 watching row 483 catched
2021.08.14 20:31:19 watching row 484
2021.08.14 20:31:19 watching row 485
2021.08.14 20:31:20 watching row 486 catched
2021.08.14 20:31:24 watching row 487 catched
2021.08.14 20:31:28 watching row 488 catched
2021.08.14 20:31:35 watching row 489


Как ускорить процесс записи данных? Может быть, есть библиотеки лучше?
  • Вопрос задан
  • 574 просмотра
Решения вопроса 1
noook
@noook
python and fishing
Я бы убрал "read_only=True" и xlsxwriter, ведь openpyxl сам умеет писать данные в xlsx.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
24 нояб. 2024, в 21:55
200000 руб./за проект
24 нояб. 2024, в 21:41
1000 руб./за проект
24 нояб. 2024, в 21:19
35000 руб./за проект