Найти - Пользователи
Полная версия: Кейса нет..... какая альтернатива
Начало » Python для новичков » Кейса нет..... какая альтернатива
1 2 3 4
doza_and
py.user.next
это где это ?
Боюсь вы их не знаете.
Если при разработке системы сообщения то добавляются то убавляются, таблица становится слишком неэффективной по памяти поскольку постоянно занимается новое адресное пространство. Особенно это существенно для микроконтроллерных систем.
py.user.next
маленькое переключение
Это что? Некоторые разработчики принципиально не применяют функции поскольку они работают дольше чем простой перескок в switch. :) А вообще каждый разработчик по своему такую архитектуру обосновывает.
Если вам нужен реально быстрый switch то используйте вычисляемый goto http://kak.znate.ru/docs/index-33646.html?page=19
dapaci
А где вообще можно почитать о том, у какой структуры данных в питоне какая асимптотическая сложность и т.д.? Немного погуглив я нашел только сравнительные тесты, а хотелось бы что-то вроде шпаргалки, поэтому спешу задать вопрос пока тема не ушла в небытие
Singularity
dapaci
https://wiki.python.org/moin/TimeComplexity
py.user.next
doza_and
Если при разработке системы сообщения то добавляются то убавляются, таблица становится слишком неэффективной по памяти поскольку постоянно занимается новое адресное пространство.
приведи пример в виде кода
насчёт switch на 100 состояний - это просто какая-то ахинея

doza_and
Некоторые разработчики принципиально не применяют функции поскольку они работают дольше чем простой перескок в switch. :)
функции - это элемент декомпозиции программного кода
если в коде невозможно разобраться, то его никто не дорабатывает потом
любая программа должна быть правильной, понятной и легко меняемой

doza_and
Если вам нужен реально быстрый switch то используйте вычисляемый goto
речь идёт про C++, там такого нет

составь конечный автомат хотя бы на десять состояний, а потом, когда он работает, попробуй поменять у него поведение
dapaci
Singularity
спасибо большое, это оно!
doza_and
:)
py.user.next
насчёт switch на 100 состояний - это просто какая-то ахинея
Посмотрите вокруг.
py.user.next
приведи пример в виде кода
Прикрепил. Это часть compile.c из исходных кодов питона 3.4. Там как раз порядка 100 состояний
Более характерный пример их техже исходников.

Длинные switch не всегда удачное решение, но в природе они существуют.

doza_and
кусок compile не прикрепился досылаю.
Lexander
doza_and
Разве речь шла не о прикладных задачах (и то только в сфере использования Питона), где действительно редко встречается (если вообще бывает) switch на 10+ состояний?
doza_and
py.user.next
речь идёт про C++
Lexander
действительно редко встречается switch на 10+ состояний
Учитывая что в питоне его вообще нет, то я бы сказал что он вообще не встречается.

Я привел пример когда обычно используется switch. Поток сообщений который надо обработать кусками кода. Тут два аспекта
1 лаконичность синтаксической конструкции
2 эффективность кода.

в C++ switch применяется когда вызов функции слишком долгая процедура. Если считать что питон не применяется в критических по времени приложениях, то фактор 2 отпадает. В этом случае и пункт 1 в виде вложенных if не сильно отличается от switch по сложности.

if i==1:
    code1
elif i==2:
    code1
.....
гипотетически:
switch i:
    case 1:
       code1
    case 2:
       code2
......
Если if длинный и хочется чтобы работало побыстрей то:
d={1:lambda :code1,1:lambda :code2}
.....
d[i]()
Но в этом случае конечно будут проблемы с контекстом.
Я если окажется что этот кусок критичен просто напишу его на C++. Для меня вопрос решается однозначно switch в питоне есть, он есть в коде на C :)
py.user.next
doza_and
А вот под с или с++ я довольно часто встречал диспетчеризацию сообщений в виде switch на несколько сотен, а то и тысяч пунктов.
а, если простой switch имеется в виду, то согласен

я подумал, что речь про конечные автоматы на 100 состояний
одинаковые состояния там можно сокращать через приведение автомата к минимальному

    switch (s) {
case S1:
a = 1;
s = S3;
break;
case S2:
a = 1;
s = S4;
break;
case S3:
b = 1;
s = S2;
break;
case S4:
b = 1;
s = S1;
break;
}

switch (s) {
case S1:
a = 1;
s = S2;
break;
case S2:
b = 1;
s = S1;
break;
}

если же минимальный имеет 100 состояний, то записывать его в виде switch'а никто не будет

doza_and
Если посмотреть выход bizon+flex то конечный автомат перехода между состояниями парсера тоже часто реализован в виде switch.
потому что это небольшой конечный автомат
(считай разные блоки (ветви) )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB