Задать вопрос

Почему программа так долго обрабатывает данные?

Не могу понять почему программа так долго обрабатывает данные.
У меня есть docx файл в нем таблица с 2554 записями(строчками), мне надо обработать их, и для этого я хочу занести каждую запись в список как элемент. Но как-то слишком долго выходит, и мне интересно с чем это связанно и можно ли как то ускорить.

# -*- coding: utf-8 -*-
from docx import Document
doc1 = Document('123.docx')

student = []

print(len(doc1.tables))
print(len(doc1.tables[0].rows))
for i in range(len(doc1.tables[0].rows)):
    student.append(doc1.tables[0].rows[i].cells[0].paragraphs[-1].text)
print(student[1])

python 2.7.10 и python-docx 0.8.5
  • Вопрос задан
  • 832 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Проблема не в циклах, проблема в самом модуле python-docx именно он работает медленно, то как вы к ячейкам обращаетесь в итоге приводит к созданию кучи временных объектов.

так будет значительно быстрее:
student =  [cell.paragraphs[-1].text for cell in doc1.tables[0].column_cells(0)]
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@deliro
Во-первых, что это за ужас?
for i in range(len(doc1.tables[0].rows)):
    student.append(doc1.tables[0].rows[i].cells[0].paragraphs[-1].text)

Замени на:
table = doc1.tables[0]
for row in table.rows:
    student.append(row.cells[0].paragraphs[-1].text)


Во-вторых, насколько долго?
Ответ написан
@lega
python-docx медленный, можете вручную распаковать docx (zip) и работать с данными напрямую (там xml), не удобно, но работать будет быстро.
Ответ написан
Комментировать
@balamut108
Py
Мне кажется будет быстрее через генератор списка: [student.append(doc1.tables[0].v.cells[0].paragraphs[-1].text) for i,v in enumerate((doc1.tables[0].rows))]
Ответ написан
@Dvvarreyn
А обязательно именно docx парсить?
Сохранить в csv и считать c помощью питоносвого csv парсера не будет быстрей?
Ответ написан
Попробуй extend вместо append.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы