Как стать автором
Обновить
8
Карма
0
Рейтинг
Кирилл Белов @KirillBelovTest

Инженер по автоматизации тестирования

  • Подписчики 2
  • Подписки 2

Ещё одна задача на множества

Добрый день! Не до конца понятны условия задачи. Все найденные числа должны быть в одних и тех же множествах? Что если множество такое:


{{1, 2}, {2, 3}, {3, 4}}


Здесь выходит, что 2 есть в первом и втором векторе, а 3 во втором и третьем. Ну и мое решение на Wolfram


image

НЛО воровало аватарки здесь

Всегда мечтал дожить до дня когда к нам прилетит ufo

Применение R при вычислениях с повышенной точностью

Добрый день! Очень интересная библиотека, спасибо за статью. Хочу предложить решение этой же задачи, которое основано на предложении в первом абзаце "Метаться в поисках другого инструмента? Тоже вариант". Решение в Wolfram Cloud:


frec[stopval_, n_, x_] := frec[stopval, n, x]= 
    If[n === stopval, 
        (stopval - 1) + stopval/(stopval + 1 + x), 
        (n - 1) + n/(frec[stopval, n+2, x])
    ]

Block[{$RecursionLimit = 4000}, N[frec[2019,1, x]/.x->1, 6000]]
Block[{$RecursionLimit = 4000}, N[frec[2019,1, x]/.x->2, 6000]]

Единственно верный способ загружать и скачивать файлы в Selenium тестах

Очень часто вместо ввода пути к файлу в элемент .//input[@type='file'] загрузка происходит при помощи JS. На элемент другого типа вешается событие при срабатывании которого открывается системное окно, а затем скрипт загружает файл на сервер. Какой в этом случае верный способ загрузить файл без изменения кода страницы или поиска нужного скрипта? На каждой странице может быть свой скрипт.

Краеугольные камни уничтожения медленного кода в Wolfram Language: ускоряем код в десятки, сотни и тысячи раз

OsipovRoman, большое спасибо за статью! Она действительно очень полезная и практичная!


К пункту 1.2


В этом совете основной посыл состоит в том, что надо использовать функциональную парадигму при необходимости применить функцию к списку. Однако, показанный эффект ускорения достигается совершенно не этим. Дело в том, что в случае с Map[#^2&, data] ускорения достигается благодаря комбинации чистая функция + встроенный цикл + упакованный массив, когда Математика встречает такую конструкцию, то применяет автокомпиляцию, которая и дает ускорение. Соответственно если использовать "шаблонную" функцию + цикл + упакованный массив — автокомпиляция не используется. И в конкретно этом случае применение Map/Table не даст разницы во времени выполнения.



Также на скриншоте видно, что нет разницы между использование чистой функции в полной записи Function[x, x^2] и в короткой #^2&. Действительно разница во времени вычисления есть при применении любой функции к неупакованному массиву при помощи Map и Table. Table проигрывает в этом случае и это не зависит от того, чистая была функция или шаблонная.


К пункту 1.4


На мой взгляд сравнение проведено некорректно. Опять же в заголовке сказано про процедурный стиль, но эффект, который дает такую разницу во времени заключается в другом. Первая операция выполнялась медленно не из-за While, а из-за медленной операции вставки. Так как списки в Математике неизменяемы, то вставка нового элемента всегда происходит с пересозданием списка целиком. Зная это тот же самый код можно переписать вот так:



Т.е. здесь заранее создается массив на 20000 целых чисел, а затем заполняется. И как теперь видно проблема была не в цикле While. Хотя без сомнения код на скриншоте не самый идеологически хороший. А что касается ускорения во втором случае — здесь была использована рекурсия с мемоизацией. Для человеческого глаза это понятнее, также не создается никаких дополнительных списков, куда надо вставлять значения и ничего не перепутать. Однако этот способ сохраняет все 20000 значений в определении. Поэтому, например, повторный вызов f /@ Range[20000] вообще должен выполнится за нулевое время, но в итоге выполнится за константное время, которое требуется на получение списка значений из памяти:



Тогда как результат в виде списка чисел Фибоначчи при повторном использовании будет взят из памяти мгновенно, так как это одна переменная, которая ссылается на один большой массив.


К пункту 3.2


Здесь мне хочется добавить, что использовать Parallelization -> True и Listable отдельно не имеет никакого смысла. Эти две опции (как показывают эксперименты) дают эффект ускорения только при совместном использовании. Я думаю популярное слово "параллелизация" введет читателей в заблуждение. Она есть, но применяется исключительно при применении к списку аргументов. Соответственно список делится на равные части по числу процессорных ядер и функция вызывается на каждом ядре попеременно для всех элементов. Если передавать один аргумент — этого эффекта не будет. Т.е. вот так cfunc[{1, 2, 3, 4}] — функция вычислит значение на каждом ядре отдельно, а вот так: {cfunc[1], cfunc[2], cfunc[3], cfunc[4]} уже нет. И еще одно замечание: fJITCompiledListable — определение этой функции не соответствует заявленному, потому что в нем по умолчанию будет также Parallelization -> True. Чтобы функция принимала на вход список и к каждому элементу применялась на одном ядре необходимо принудительно указывать False. На скриншоте ниже показано, что использование двух опций отдельно эквивалентно их отсутствию, если оценивать по скорости. И только комбинация опций дает ускорение в число раз равное количеству ядер:



Еще одним способом ускорить скомпилированную функцию является возможность оптимизации выражений, когда повторяющиеся части выражения вычисляются только один раз. Например в коде ниже это x^2:



Чтобы убедиться в том, что повторяющиеся части выражения действительно были заменены посмотрим на "псевдобайткод" скомпилированных функций:



И последнее про компиляцию при помощи Compile. Не всякое выражение будет скомпилировано. Существует определенный список валидных функций, которые можно использовать в выражениях внутри Compile. Посмотреть на него можно вот так:


Needs["Compile`"]
Compile`CompilerFunctions[]

Еще одной тема, которой не хватает для полноты картины и раскрытия компиляции в Wolfram Language — это экспериментальные функции в версии Wolfram Language 12.0: FunctionCompile, KernelFunction и связанные с ними. На мой взгляд одним из преимуществ данных функций является возможность более строгого указания типов входных аргументов и типа результата, а также добавлена возможность безболезненно использовать вызов встроенной функции ядра Математики внутри скомпилированной.


Спасибо всем, кто дочитал этот комментарий и очень надеюсь, что кому-то поможет это небольшое дополнение по теме компиляции выражений в Wolfram Language.

Бесплатная библиотека Wolfram Engine для разработчиков программного обеспечения

нам хотелось бы держаться как можно дальше от множества вариантов рекламных уловок

Очень иронично, что в статье про это сказано, а OsipovRoman добавляет свою рекламу в переводе статьи сделанном нанятыми переводчиками в корпоративном блоге компании, в которой он не работает.

Бесплатная библиотека Wolfram Engine для разработчиков программного обеспечения

Оставлю дополнение к вашему комментарию.


Статья немного похоже на воззвание «Почему же, черт возьми, меня, такого замечательного, никто не любит?»

Абсолютно согласен с этим, хотя может быть сам Стивен Хьюгович и не пытался вкладывать такой посыл, но получилось похоже. Данная статья вышла относительно давно и на самом деле эта новость уже освещалась на хабре, хоть и юридически это был перевод другой статьи-конспекта.


С базами данных тоже не все очевидно – в реальном проекте почти наверняка понадобятся данные которых в языке нет. Какому проценту разработчиков может пригодиться база населения городов мира? В научном проекте – безусловно, подобные базы очень полезны. Но в разработке обычного ПО их польза сомнительна.

Думаю все же наличие любых встроенных баз данных, которые загружаются с серверов Wolfram Research — это лучше чем их полное отсутствие. Допустим их даже не применить в специфическом проекте, но в конце концов где-то на сайте компании есть описание возможности использовать свои собственные базы данных точно таким же способом как и встроенные. Но этот способ конечно же стоит отдельных денег, что сразу закономерно снижает интерес. Ибо эта схема реализуется при покупке приватного облака и загрузки данных в него.


Второе (и главное) – даже для собственного некоммерческого использования я должен получить на сайте временную лицензию и зарегистрировать продукт через интернет. А судя по фразе «В отличие от Mathematica, он не лицензирован для генерации результатов для коммерческого или организационного использования.» — я даже прав на результаты полученные дома не имею.

Не гарантирую точность, так как и сам не до конца понял лицензионное соглашение, но для личного использования можно получить бесплатно один раз для одного аккаунта постоянную лицензию, но уже невозможно использовать где-либо еще, что опять же очень плохо. И если я правильно интерпретировал фразу про использование результатов, то имеетя ввиду именно продажа, но, наверное, в научной работе их вполне можно использовать.


Используя эту технологию, я должен убедить руководство закупить лицензии для всех потенциальных пользователей (соответственно уменьшив маржу нашего продукта, возможно в разы), причем даже неизвестно на каких условиях (вначале сделайте продукт, а мы потом подумаем сколько с вас за него взять). Плюс еще получить проблемы с лицензированием каждого клиента.

Это на мой взгляд проблема даже больше чем сама по себе стоимость для разработчика. Полное отсутствие возможности пользоваться готовыми решениями для массового пользователя. Есть конечно Wolfram Player (Ранее CDF Player), который совсем бесплатен, но его функционал сильно урезан, да и все что он может делать по сути — просматривать красивые подготовленные презентации. Установка Wolfram Player — это отдельная история. Когда браузеры еще поддерживали такие расширения — думаю пользователи уже тогда не хотели устанавливать Adobe Flash Player, на который требуется 2 минуты и чуть-чуть свободного места, после чего он находится где-то в тени браузера, тогда как Wolfram Player весит больше гигабайта и его необходимо специально запускать, так как в качестве расширения браузера он тоже больше не поддерживается.


Первый – выход на массовый рынок пойдя по пути игровых движков: предлагать бесплатную базовую версию, в том числе для коммерческого использования, но только при обороте менее заданной суммы (как Unity, 100 тыс. $ в год), при превышении оборота – ставить серьезный ценник для разработчиков. С конечных пользователей не брать денег совсем, даже упоминания не требовать. Иначе о массовости можно забыть.

Второй – оставаться в собственной нише «умного» вычислительного инструмента, для хобби проектов и научных исследований. Честно признать, что это не «язык программирования», а продвинутая система запросов к базе, обычное ПО с соответствующей системой лицензирования. По сути, все та же «Mathematica» только с базой побольше.

Также абсолютно согласен с обоими предложениями. В данный момент Wolfram Research делает не очень быстрые шаги в сторону бесплатного использования и разработки, как будто пробует почву — об этом говорит и бесплатный (в том числе для коммерческого использования но с сильными ограничениями по ресурсам) Development Platform и Wolfram Player и совсем свежий Wolfram Engine, который кстати можно прикрутить к jupyter notebook. На мой взгляд можно также использовать и еще один путь, похожий на первый, предложенный вами. Это сделать полностью бесплатной для любого типа использования минимальную версию ядра, которая бы весила значительно меньше чем Wolfram Engine. Пусть эта версия содержала бы основной язык, работу с сетью, файловой системой, примитивную графику и что-то еще подобное, а за отдельную плату предоставлять доступ к встроенным базам, тренировочным данным для машинного обучения, серверам, запланированным задачам и прочему. Тогда можно было бы добиться легкого распространения как среди разработчиков, так и среди пользователей. К сожалению такой вариант малореалистичен из-за того, что с самого начала Wolfram Mathematica проектировалась с тесной интеграцией всех модулей, библиотек и пакетов друг с другом, а по итогу безболезненно разделить их уже не получится.


Сам я конечно же фанат языка Wolfram и всегда буду за то, чтобы он получал все большее распространиние в среде разработки ПО, политика компании-разработчика вселяет оптимизм, но в действительности пока что это происходит очень медленно и с постоянными ограничениями.

Вычисление весового спектра линейного подпространства в Wolfram Mathematica

А кому нужна оптимизация в Wolfram?


Вы имеете ввиду, что она никому не нужна? Я встречал множество задач и примеров, где требовались различные оптимизации. Вот где это использовал я сам:

github.com/KirillBelovTest/CustomImportExport

В коде пакета есть функции для работы с данными SEG-Y и они как раз таки являются скомпилированными. А пользователь, задавший вопрос здесь:

community.wolfram.com/groups/-/m/t/1272436

Не является программистом и не будет ничего писать на компилируемых языках, ему изначально удобнее работать в Математике чтобы анализировать данные.

На счет того, что закомментированно — для этого надо просто иметь подходящий Си-компилятор подходящей версии, я сделал так, чтобы те, кто хочет код просто скопировать/вставить не встретили ошибку без него. По подключению есть подробный гайд, где перечислены поддерживаемые компиляторы. В среднем эта опция давала ускорение еще в 1.5-2 раза:

reference.wolfram.com/language/CCompilerDriver/tutorial/SpecificCompilers.html

TelegramBot в облаке Wolfram

Превратить этого бота в интерпретатор Mathematica еще проще. Просто заменить:
answer[text_String]["answer"] := ToString[ToExpression[text]]
И все команды, которые должны возвращать текстовый результат будут работать. Отдельно нужно реализовать команды, которые возвращают график через sendPhoto. Тоже самое для аудио-файла или видео/анимации. Я хотел обратить особое внимание на возможность развертывания в облаке — тогда не требуется запускать отдельный процесс или докер-контейнер на компьютере или сервере.

Лучший Способ Программирования (Better way To Code)

Прошу прощения. Попробуйте еще раз. По умолчанию документ имеет доступ private
www.wolframcloud.com/objects/3cfdf758-5909-4670-a9ee-c739a3b6601d
или
lab.wolframcloud.com/objects/3cfdf758-5909-4670-a9ee-c739a3b6601d
Там вы можете скопировать себе или скачать документ
image

Лучший Способ Программирования (Better way To Code)

Про Jupyter уже сказали. Но и Wolfram умеет то, что вы описали — общие документы и передача ссылок. Вот пример:
lab.wolframcloud.com/app/objects/3cfdf758-5909-4670-a9ee-c739a3b6601d
Есть учебники написанные таким образом (необходимо иметь аккаунт на account.wolfram.com). Но лично мне статья очень понравилась, потому что это действительно удобно и не зря идея интерактивных блокнотов постепенно получает все большее распространиение.

Илон Маск: колонистов на Марсе защитят локальные генераторы электромагнитного поля

Если я правильно посчитал, то выходит вот что:
Пусть диаметр спутника/генератора: 10 м
Низкоорбитальные спутники могут быть на высоте 700 км
Тогда угловой размер такого спутника: 5.89''
Кстати угловой размер Урана около 4''
Радиус Марса: 3390 км
320 радиусов Марса: 1084800 км
А угловой размер генератора с диаметром 10 м на таком расстоянии будет: 0.0038''
То есть это будет точка в 1550 раз меньшего диаметра.

Илон Маск: колонистов на Марсе защитят локальные генераторы электромагнитного поля

Ну там будет расстояние в 320 радиусов Марса — это в 2.5 раза дальше чем до Луны. Размер генератора видимо сопоставим с размером искуственных спутников Земли. Так что увидеть будет его нельзя никак — даже в телескоп.

Как обучать вычислительному мышлению?

По умолчанию после регистрации у вас план использования сервиса Wolfram|One — Viewer. А ссылка на облачный документ как раз открывает его с помощью Wolfram|One. В этом случае вам будет доступен только просмотр облачных блокнотов, но не выполнение и не редактирование. Вы можете полкчить триал версию или же открыть development platform (https://develop.open.wolframcloud.com/app/), загрузить туда ThingsToTry.nb и работать уже там. В development platform доступны почти все возможности Wolfram Language, плюс этот сервис можно использовать в коммерческих целях.

Простой http-сервер на Wolfram Language

Каким образом вы предлагаете измерять его производительность? Код в статье создает демонстрационный сервер. Нет никакого смысла сравнивать его с реальными приложениями. Лично я не представляю что именно можно в данный момент на нем тестировать. Хотя если вас это интересует — то вы сами можете проделав все те же манипуляии запустить у себя этот сервер, а затем провети его нагрузочное тестирование. Если вы это сделаете — мне будет очень интересно узнать результат.

Простой http-сервер на Wolfram Language

Мне кажется, что смысл статьи был изложен в выводе. Можно еще раз его повторить в комментариях. Во-первых — демонстрация интересных, но малоиспользуемых синтаксических возможностей языка на примере решения задачи по созданию веб-сервера. Во-вторых смысл статьи в попытке заинтересовать тех, кто ее прочитает в Wolfram Language. В-третьи в статье дается ответ на вопрос, который был задан в публикации послужившей источником для написания этой статьи — вопрос о возможности реализации сервера только средствами Mathematica без использования других языков.

Информация

В рейтинге
Не участвует
Откуда
Саратов, Саратовская обл., Россия
Зарегистрирован
Активность