Портирование VB-макроса на Python

Автор karpo518, 10 апреля 2017, 08:33

0 Пользователи и 1 гость просматривают эту тему.

karpo518

Добрый день. Есть макрос на VB, который парсит текст. Макрос обходит текст посимвольно и выполняет много проверок для каждого символа, поэтому работает очень медленно.
1. Есть ли смысл портировать макрос на Python? Не ради продвинутых инструментов языка и синтаксического сахара, а ради производительности.
2. Можно ли запаковать макрос на Python в распространяемый пакет для установки? Нет ли с этим никаких сложностей?
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

mikekaganski

VB?

Непонятно, что за "много проверок" имеются ввиду. Если это множество обращений к LO API, то вероятнее всего, ускорения не будет, поскольку эти обращения одинаково дороги из любого скриптового языка. А если Вы говорите об обработке, которая производится на стороне макроса, то там весьма возможно, что Python предоставляет встроенные/библиотечные функции, гораздо более производительные, чем BASIC (всё же предположу, что идёт речь о StarBASIC или по крайней мере VBA, но не VB). Нужно видеть код, чтобы сказать определённо.
С уважением,
Михаил Каганский

Yakov

Цитата: karpo518 от 10 апреля 2017, 06:332. Можно ли запаковать макрос на Python в распространяемый пакет для установки? Нет ли с этим никаких сложностей?
Можно упаковать в  *.oxt -расширение LO/Apache Open Office.

economist

#3
Ускорения в большинстве задач макросов VB, VBA, SB - на Python не будет, хотя, например, модуль re дает +30% скорости, sqlite3 по сравнению с ADO или sqlite3.exe +50% скорости итд.    

А вот кроссплатформенность, конвертация текста из/в любую кодировку, потенциал роста - да. Python неимоверно богат бесплатными библиотеками на все случаи жизни, его код в 5 раз понятнее и короче.

Проиллюстрирую похожим кейсом:

Я написал 10 кбайт кода демона-парсера-укладывателя TXT из 1С в SQLite на VBS+sqlite3.exe (за месяц, по часу в день). Код непростой (мониторинг папки на появление файлов опр. типа, нужна переразбивка почтовых адресов, исправление ошибок, склонение ФИО по падежам, удаление таблиц в СУБД и их пересоздание, обновление индексов итп.)

Потом, спустя квартал, это же всё, один-в-один, ради спортивного интереса - переписал на голом Python 3.5 (за неделю, по часу в день). Влезло всё в 1,5 кбайта, работать стало в 4 раза быстрее!

В отличие от написания кода на VBS, вслепую, без IDE, в редакторе FAR - в Питоне я шкодил на PyScrypter, с пошаговой отладкой, intellysense и прочими плюшками.

И удовольствия от процесса - получил тоже в 4 раза больше, благодаря именно Python.

Писать парсер на StarBasic можно, но недальновидно - язык длинен, тот же вечный цикл будет смотреться костылем итд.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

karpo518

VB - это Visual Basic 6.0. Я зык программирования, который предоставляется по дефолту в последней версии OO как средство разработки макросов.
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

economist

karpo518 - вы неправы, по дефолту в OpenOffice|LibreOffice язык программирования - StarBasic, он не имеет никакого отношения к VisualBasic, и является аналогом VBA для Microsoft Office, но работает в OpenOffice|LibreOffice.

Хотя часть конструкций языка (циклы, условия итп) почти 100% совпадает - основную сложность в программировании на StarBasic представляет использование объектной модели OpenOffice|LibreOffice и его API для работы с текстами, ячейками, формулами итп.

Сейчас StarBasic "понимает" примерно половину самых часто нужных команд из VBA в особом режиме совместимости. Для этого вверху текста модуля нужно написать:


Option VBASupport 1
Option Compatible

И один раз выполнить в этом модуле простой макрос:


Sub VBASupportON()
ThisComponent.BasicLibraries.VBACompatibilityMode=true 
End sub
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...