Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2014 19:52:27

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

py.user.next
это где это ?
Боюсь вы их не знаете.
Если при разработке системы сообщения то добавляются то убавляются, таблица становится слишком неэффективной по памяти поскольку постоянно занимается новое адресное пространство. Особенно это существенно для микроконтроллерных систем.
py.user.next
маленькое переключение
Это что? Некоторые разработчики принципиально не применяют функции поскольку они работают дольше чем простой перескок в switch. :) А вообще каждый разработчик по своему такую архитектуру обосновывает.
Если вам нужен реально быстрый switch то используйте вычисляемый goto http://kak.znate.ru/docs/index-33646.html?page=19



Отредактировано doza_and (Фев. 27, 2014 19:53:14)

Офлайн

#2 Фев. 27, 2014 23:21:18

dapaci
Зарегистрирован: 2014-02-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

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

Отредактировано dapaci (Фев. 27, 2014 23:22:35)

Офлайн

#3 Фев. 27, 2014 23:42:03

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

Офлайн

#4 Фев. 27, 2014 23:59:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

doza_and
Если при разработке системы сообщения то добавляются то убавляются, таблица становится слишком неэффективной по памяти поскольку постоянно занимается новое адресное пространство.
приведи пример в виде кода
насчёт switch на 100 состояний - это просто какая-то ахинея

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

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

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



Отредактировано py.user.next (Фев. 28, 2014 00:01:15)

Офлайн

#5 Фев. 28, 2014 00:10:55

dapaci
Зарегистрирован: 2014-02-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

Singularity
спасибо большое, это оно!

Офлайн

#6 Март 4, 2014 07:28:08

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

:)

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

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



Отредактировано doza_and (Март 4, 2014 07:28:32)

Прикреплённый файлы:
attachment bb.cpp (9,3 KБ)

Офлайн

#7 Март 4, 2014 07:29:39

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

кусок compile не прикрепился досылаю.



Прикреплённый файлы:
attachment comp.c (4,9 KБ)

Офлайн

#8 Март 4, 2014 13:17:03

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

doza_and
Разве речь шла не о прикладных задачах (и то только в сфере использования Питона), где действительно редко встречается (если вообще бывает) switch на 10+ состояний?



Офлайн

#9 Март 4, 2014 20:16:41

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

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 :)



Офлайн

#10 Март 4, 2014 22:15:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Кейса нет..... какая альтернатива

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.
потому что это небольшой конечный автомат
(считай разные блоки (ветви) )



Отредактировано py.user.next (Март 4, 2014 22:26:38)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version