Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 16, 2011 14:18:51

Lavrofff
От:
Зарегистрирован: 2011-08-16
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Скорость работы pyUNO

Код.

def to_unicode(sequence):
ret_sequence = (unicode(value, "utf8") for value in sequence)
return ret_sequence


def build_header():
fields = \
["Дата", "Время", "Локатор", "Дата.Прод", "Время.Прод", "Тариф",
"АК.Сборы", "АГ.Сборы", "Доставка","Страховка", "Аэроэкспресс",
"Прочие сборы", "Оплачено", "Комиссия", "Транзакция", "Перечислено",
"Тип док.", "Номер док.", "ППР", "Взрослых", "Детей", "Младенцев",
"eTicket", "Билеты", "Туда-обратно", "Сегменты", "Сегмент 1",
"Дата вылета", "Коды тарифов", "Сегмент 2", "Дата вылета",
"Коды тарифов", "Сегмент 3", "Дата вылета", "Коды тарифов",
"Сегмент 4", "Дата вылета", "Коды тарифов"]
return to_unicode(fields)

def report_header(sheets):
for sheet in sheets:
fields = build_header()
column = 1
st = datetime.utcnow()
for field in fields:
sheet.write(1,column, field)
column += 1
for i in range(1, 39):
sheet.write(2, i, i)
print "for sheet writing header time", datetime.utcnow() - st
sheet определяется так. обертка над XSpreadSheet.
class oo_Sheet:
def __init__(self, sheet):
self.sheet_ = sheet
def write(self, row, col, value):
cell = self.sheet_.getCellByPosition(col, row)
if type(value) == type(str()) and len(value) != 0:
value = "'" + value
cell.setFormula(value)
Результат.

for sheet writing header time 0:00:00.711877
for sheet writing header time 0:00:00.710832
for sheet writing header time 0:00:00.691251
for sheet writing header time 0:00:00.689296

Слишком долго. Создан док так.
        props = ooHelper.oo_properties(OpenFlags="B",Hidden=True)
self.runner_ = ooHelper.OORunner()
self.desc_ = self.runner_.connect()
return self.desc_.loadComponentFromURL("private:factory/scalc", "_blank", 0, props)
connect в свою очередь вызывает startup и стартует soffice в хиден-режиме (если нету уже запущенного процесса).
Сам connect работает через pyUNO.

В свою очередь к примеру тот же XlsXcessive дает такие показатели на том же коде.

for sheet writing header time 0:00:00.005864
for sheet writing header time 0:00:00.004231
for sheet writing header time 0:00:00.004209
for sheet writing header time 0:00:00.002672

Реально-ли добиться такого через UNO? Если же нет, что лучше использовать, ooolib или что-то другое?



Отредактировано (Авг. 16, 2011 14:32:30)

Офлайн

#2 Авг. 16, 2011 15:00:21

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Скорость работы pyUNO

Даже если все это написать на С++, скорость не увеличится. Самые тормоза - это когда работаешь с ячейками по отдельности. Надо читать/писать сразу целыми диапазонами (щи'тами). Скорость увеличится в разы.



Офлайн

#3 Авг. 16, 2011 15:06:50

Lavrofff
От:
Зарегистрирован: 2011-08-16
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Скорость работы pyUNO

Isem
Спасибо. Впринципе прикрутил ooolib.
Скорость на данном участке кода
for sheet writing header time 0:00:00.008813
for sheet writing header time 0:00:00.007813
for sheet writing header time 0:00:00.004560
for sheet writing header time 0:00:00.002244

Так что наверное закрою вопрос. Диапазонами писать не подходит, т.к. код используется с pyExceler, XlsXcessive в зависимости от желаемого формата файла.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version