| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как можно использовать код Python в Visual Lisp? Или как сделать параллельное программирование в Visual Lisp?

Как можно использовать код Python в Visual Lisp? Или как сделать параллельное программирование в Visual Lisp?

Ответ
Поиск в этой теме
Непрочитано 19.10.2022, 10:17 #1
Как можно использовать код Python в Visual Lisp? Или как сделать параллельное программирование в Visual Lisp?
power85
 
Регистрация: 03.02.2017
Сообщений: 56

Здравствуйте
Имеется lisp код на 1600 строк выполнятся, он может 12час. Определено узкое место. Нужно распараллелить вычисления на многоядерном процессоре.
Кроме этого я знаю языки Python и Vba. В Python есть, возможно, распараллелить вычисления и сделать функцию для узкого места. Но как её использовать в lisp?
Переписать весь код lisp 1600 строк в код на Python не реально.
Просмотров: 5521
 
Непрочитано 19.10.2022, 10:41
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Цитата:
Сообщение от power85 Посмотреть сообщение
Переписать весь код lisp 1600 строк в код на Python не реально.
думаете городить интеграцию с кодом на питоне с параллельным выполнением вычислений займет сильно меньше времени?) А VBA - это тот же ActiveX, скорости на нем не получите.

----- добавлено через ~5 мин. -----
тот же код на .Net можно ориентировочно считать на пару порядков быстрее лиспа работает, т.е. вместо 12 часов будет 10 мин даже без распараллеливания

----- добавлено через ~8 мин. -----
Цитата:
Сообщение от power85 Посмотреть сообщение
Или как сделать параллельное программирование в Visual Lisp?
ничего, что акад (хотя, может, в последних версиях есть подвижки) - работает на одном ядре?)
Сергей812 вне форума  
 
Непрочитано 19.10.2022, 10:55
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Я бы подумал на предмет изменения этого самого куска. Логического изменения.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.10.2022, 10:57
#4
power85


 
Регистрация: 03.02.2017
Сообщений: 56


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
тот же код на .Net можно ориентировочно считать на пару порядков быстрее лиспа работает, т.е. вместо 12 часов будет 10 мин даже без распараллеливания
.Net реально на столько крут? Есть тесты сравнения? Конечно рискованно и сложно переписать на Net чтобы проверить.
power85 вне форума  
 
Непрочитано 19.10.2022, 10:59
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Зависит от задач и сложности хранения данных. И от качества кода, конечно. У меня было, что NET, написанный криво, работал втрое медленнее некомпилированного лиспа. А бывало, что NET в несколько десятков раз быстрее.
P.S. Этот кусок выполняется 12 часов в некомпилированном виде? А если собрать его в fas?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.10.2022, 11:00
#6
power85


 
Регистрация: 03.02.2017
Сообщений: 56


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я бы подумал на предмет изменения этого самого куска. Логического изменения.
На мой взгляд я написал этот кусок максимально оптимизировано.

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
P.S. Этот кусок выполняется 12 часов в некомпилированном виде? А если собрать его в fas?
Да собрал я его в fas т.е. с компилируемый.
power85 вне форума  
 
Непрочитано 19.10.2022, 11:03
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Offtop: Я в свое время тоже так думал. Пока не поменял ненужный mapcar на foreach

----- добавлено через ~2 мин. -----
Offtop: Ну и - дополнительно - вопрос в качестве входящих данных. Если они слабоструктурированы, то, может, узкое место совсем не здесь? ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.10.2022, 11:08
#8
power85


 
Регистрация: 03.02.2017
Сообщений: 56


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Зависит от задач и сложности хранения данных. И от качества кода, конечно. У меня было, что NET, написанный криво, работал втрое медленнее некомпилированного лиспа. А бывало, что NET в несколько десятков раз быстрее.
То есть функцию можно сделать с параллельным программированием можно сделать только в Net?

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Offtop: Ну и - дополнительно - вопрос в качестве входящих данных. Если они слабоструктурированы, то, может, узкое место совсем не здесь? ))
Может быть не здесь. Там долго происходит проверка (поиск) куда можно поставить мультивыноски между примитивами. А проверка происходит на пересечения.
power85 вне форума  
 
Непрочитано 19.10.2022, 11:14
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Я сильно подозреваю, что параллельность не сильно понадобится. Смотри, допустим, есть задача из списка вытащить что-то там по ключу. Проблема в том, что ключ может быть строковым. И необязательно в едином регистре. Придется городить костыли, хотя достаточно просто данные "снаружи" привести в божеский вид.
Offtop: Пример, конечно, высосан из пальца, но тем не менее:
Код:
[Выделить все]
 (defun t1 (key data)
  (cdr (assoc (if (= (type key) 'str)
                (strcase key)
                key
              ) ;_ end of if
              (mapcar (function (lambda (x)
                                  (cons
                                    (if (= (type (car x)) 'str)
                                      (strcase (car x))
                                      (car x)
                                    ) ;_ end of if
                                    (cdr x)
                                  ) ;_ end of cons
                                ) ;_ end of LAMBDA
                      ) ;_ end of function
                      data
              ) ;_ end of mapcar
       ) ;_ end of assoc
  ) ;_ end of cdr
) ;_ end of defun

(defun t2 (key data)
  (cdr (assoc key data))
) ;_ end of defun
И собственно проверки:
Код:
[Выделить все]
 _$ (setq key "a" data '((1 . 20) ("b" . 1342) ("A" . "asdf") ("a" . "qwer")))
((1 . 20) ("b" . 1342) ("A" . "asdf") ("a" . "qwer"))
_$ (t1 key data)
"asdf"
_$ (t2 key data)
"qwer"
_$ (BENCHMARK '((t1 key data) (t2 key data)))
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):

    (T2 KEY DATA).....1453 / 1.61 <fastest>
    (T1 KEY DATA).....2344 / 1 <slowest>
И результаты разные
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.10.2022, 11:18
#10
power85


 
Регистрация: 03.02.2017
Сообщений: 56


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я сильно подозреваю, что параллельность не сильно понадобится. Смотри, допустим, есть задача из списка вытащить что-то там по ключу. Проблема в том, что ключ может быть строковым. И необязательно в едином регистре. Придется городить костыли, хотя достаточно просто данные "снаружи" привести в божеский вид.
Спасибо За ответы.
Понятно.
power85 вне форума  
 
Непрочитано 19.10.2022, 11:24
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Цитата:
Сообщение от power85 Посмотреть сообщение
.Net реально на столько крут?
.Net работает фактически напрямую с акадом (через обертки над нативным С++), а сама обработка данных вообще акад не затрагивает по сути. Плюс есть куча готовых вещей - списки, словари и т.д. Ну а так смотря какой код напишите) Вот у Алексея были тесты, у меня по сравнению с аналогичными задачами при переходе с Interop (тот же ActiveX) на .Net скорость выполнения кода примерно на пару порядков и подросла.

Причем на .Net можно делать AutoLISP Function Definition и вызывать из лиспа основной программы (это к вопросу тестирования производительности - что не всю программу перелопачивать сразу, а по частям).
Сергей812 вне форума  
 
Автор темы   Непрочитано 19.10.2022, 11:33
#12
power85


 
Регистрация: 03.02.2017
Сообщений: 56


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
.Net работает фактически напрямую с акадом (через обертки над нативным С++), а сама обработка данных вообще акад не затрагивает по сути. Плюс есть куча готовых вещей - списки, словари и т.д. Ну а так смотря какой код напишите) Вот у Алексея были тесты, у меня по сравнению с аналогичными задачами при переходе с Interop (тот же ActiveX) на .Net скорость выполнения кода примерно на пару порядков и подросла.
Спасибо за ответы.
Понятно. Круто.
power85 вне форума  
 
Непрочитано 19.10.2022, 11:37
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Цитата:
Сообщение от power85 Посмотреть сообщение
ам долго происходит проверка (поиск) куда можно поставить мультивыноски между примитивами. А проверка происходит на пересечения.
Знакомая задача Тут вполне может оказаться наиболее выгодным (если оставлять все на лиспе) создавать новый документ через ObjectDBX, туда клонировать примитивы и напрямую в том документе создавать / проставлять мультивыноски. А потом готовые мультивыноски склонировать в текущий. Тупо, но иногда достаточно выгодно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.10.2022, 11:39
#14
power85


 
Регистрация: 03.02.2017
Сообщений: 56


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Причем на .Net можно делать AutoLISP Function Definition и вызывать из лиспа основной программы (это к вопросу тестирования производительности - что не всю программу перелопачивать сразу, а по частям).
Вот это другое дело.
То есть можно создать в VB.NET функцию далее сохранить в dll. Далее загрузить dll в autocad через netload и можно пользоваться этой функцией как обычной lisp? Просто я не профессиональный программист.

----- добавлено через ~6 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Знакомая задача Тут вполне может оказаться наиболее выгодным (если оставлять все на лиспе) создавать новый документ через ObjectDBX, туда клонировать примитивы и напрямую в том документе создавать / проставлять мультивыноски. А потом готовые мультивыноски склонировать в текущий. Тупо, но иногда достаточно выгодно.
Понятно. Хорошая идея.

Последний раз редактировалось power85, 19.10.2022 в 11:52.
power85 вне форума  
 
Непрочитано 19.10.2022, 11:48
#15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Цитата:
Сообщение от power85 Посмотреть сообщение
То есть можно создать в VB.NET функцию далее сохранить в dll. Далее загрузить dll в autocad через netload и можно пользоваться этой функцией как обычной lisp?
Да, можно. Просто у меня на такие вещи почему-то достаточно большие потери на разбор входящих данных (если это списки какие-то достаточно странные) и формирование выходных списков. Но из меня NET-программист как из слона балерина
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.10.2022, 12:07
#16
румата


 
Регистрация: 06.04.2015
Сообщений: 2,676


Цитата:
Сообщение от power85 Посмотреть сообщение
То есть можно создать в VB.NET функцию далее сохранить в dll. Далее загрузить dll в autocad через netload и можно пользоваться этой функцией как обычной lisp?
Да, можно. Можно даже командный метод программирования в .net использовать

----- добавлено через ~11 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Просто у меня на такие вещи почему-то достаточно большие потери на разбор входящих данных (если это списки какие-то достаточно странные) и формирование выходных списков.
Не понятно, что за входные списки?
румата вне форума  
 
Непрочитано 19.10.2022, 12:22
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Ну, к примеру, лисповая функция обрабатывает список вида '(("key1" . "value1") ("key2" "val21" "val22" "val23) ...), и должна вернуть нечто типа '((1 . 1) (2 . 3) ...) - логика сейчас не важна. На NET (я про замену "в лоб") придется корректно разбирать входящий параметр и опять же - корректно формировать выходной список. У меня на выполнение именно этого куска тратится прилично времени.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.10.2022, 12:31
#18
румата


 
Регистрация: 06.04.2015
Сообщений: 2,676


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну, к примеру, лисповая функция обрабатывает список вида...
Не понятно откуда берется и что определяет такой список вида... Это парсинг данных из внешнего файла для скармливания автокаду или еще что?
румата вне форума  
 
Непрочитано 19.10.2022, 12:40
#19
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Я не про это. На входе в функцию данные, которые как-то структурированы и которые надо каким-то хитрым образом обработать. И вернуть тоже список, чтобы не порушить остальной код.
К примеру:
Код:
[Выделить все]
 (setq lst (vl-remove nil
                     (apply (function append)
                            (mapcar (function (lambda (name)
                                                (read-data-from-dict ent name)
                                              ) ;_ end of LAMBDA
                                    ) ;_ end of function
                                    '("data" "links" "ext")
                            ) ;_ end of mapcar
                     ) ;_ end of apply
          ) ;_ end of vl-remove
) ;_ end of setq
После этого как раз и получаем список типа (("key1" . "value1") ("key2" "val21" "val22" "val23) ...). А дальше где-то по коду встречается
Код:
[Выделить все]
 (setq res (change-dict-datas lst))
И твоя функция change-dict-datas как раз ожидает формат lst, и возвращает '((1 . 1) (2 . 3) ...) для дальнейшего использования. Так что если ты переписываешь change-dict-datas на NET, то и новое определение должно возвращать такое же. Иначе надо переделывать вообще все, а на это никогда нет ни времени, ни возможностей.

----- добавлено через ~1 мин. -----
Естественно, все имена фунций выдуманы прямо на ходу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.10.2022, 12:49
#20
power85


 
Регистрация: 03.02.2017
Сообщений: 56


Цитата:
Сообщение от румата Посмотреть сообщение
Можно даже командный метод программирования в .net использовать
А где можно про это почитать? Или как это делается?
power85 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как можно использовать код Python в Visual Lisp? Или как сделать параллельное программирование в Visual Lisp?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли на языке Python сделать графическую программу по анализу тензора напряжений? PETR_THE_GREAT Программирование 4 17.02.2022 16:15
Можно ли использовать для шпилек резьбовые штанги вместо арматуры? Drake Железобетонные конструкции 9 22.06.2021 03:38
Можно ли для отделки пола в Технических помещениях торгового центра использовать линолеум Г1В2Д2Т2РП1 ? drill_man Поиск литературы, чертежей, моделей и прочих материалов 32 06.04.2013 15:54
Какую версию ObjectARX с каким AutoCAD можно можно использовать? nav3000 Программирование 3 01.12.2012 21:37
Можно ли использовать формы VBA для запуска lisp команд? Kserg_nn LISP 4 05.02.2010 20:00