Pull to refresh
4
0.2

Пользователь

Send message

Львиную долю ускорения в вашем варианте дает замена random.uniform на random.random, из вызова которого первый, собственно, и состоит, убирая лишний вызов функции. На втором месте замена возведения в степень на умножение, эффект от которой не столь впечатляющий, но хорошо заметный.
Не могли бы вы пояснить смысл остальных оптимизаций, в частности, замены int на float и инкремента на 4 вместо 1 в счетчике?

исходного кода проекта, который поставлялся вместе с оборудованием

Часто вместе с оборудованием не только не предоставляют исходный код, но и включают встроенные в ПЛК средства защиты от выгрузки скомпилированного проекта штатными средствами и/или запрещают лезть внутрь под угрозой лишения гарантии.
Более того, у пользователя оборудования вполне может не быть в штате специалистов, которые бы понимали, где у ПЛК программа и почему она важна. Если проект изначально написан сколько-нибудь адекватно, само оборудование не модифицируется и с обслуживанием все достаточно хорошо, чтобы не возникало необходимости программно решать аппаратные проблемы, то можно годами вполне успешно работать и без программиста.

А в STEP5 были английские мнемоники?

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

Если на машине уже стоит node exporter, то для экспорта вывода задач из cron'a можно воспользоваться textfile collector. Собственно, если задача выполняется под рутом, например сбор статистики S.M.A.R.T., то ей совершенно определенно не стоит иметь http-эндпоинт.

неопределенное поведение (например выход будет моргать по ходу исполнения логики в Allen-Bradley, а в Сименсе не будет)

Как минимум у Сименс это не какая-то особенность реализации, а вполне себе документированная фича с известными правилами работы и целым разделом документации, посвященным ее настройке, поэтому словосочетание "неопределенное поведение" ей, мне кажется, не подходит. Если требуется совместимость с кодом, который завязан на мгновенное обновление, — как минимум в четырехсотых контроллерах эту штуку можно просто отключить в конфигурации.


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

Позволю себе развернуть мысль: если нужно проверить, входит ли элемент в последовательность, — просто используйте синтаксис


x in y

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


>>> from timeit import timeit
>>> timeit('200_000_000 in range(1_000_000_000)', number=1)
2.7045607566833496e-06

Information

Rating
2,243-rd
Registered
Activity