Форум сайта python.su
Есть теоретические свойства алгоритмов и есть жестокая реальность выполнения кода на существующих вычислительных средствах.
import time import numpy as np import pylab n = [] t = [] f=4 rs=np.random.rand(50) while f < 1000000: i=int(f) val = set(np.random.rand(i)) t0 = time.clock() ou1= [j in val for j in rs] t1 = time.clock() n.append(len(val)) t.append(t1-t0) print n[-1], t[-1] f*=1.2 pylab.plot(n,t);pylab.show()
switch(i) { case 1:{f1(); break} case 20:{f20(); break} ..... }
set<int,void *f()> arr; arr[i]()
Отредактировано doza_and (Окт. 26, 2013 09:02:17)
Офлайн
doza_andСейчас уже, начиная с Watcom c++, который, к сожалению, микрософт загубил на корню, кейс легко оптимизируется. Только дебил выпустит компилятор, типа делфи, и будут рады. Питон ими даже не пахнет.
Рассмотрение получившихся ассемблерных кодов показало, что большинство компиляторов сваливается на банальный последовательный перебор i==1,i==20,… с джампами на соответствующий кусок кода. Иногда встречается двоичный поиск. Выравнивания блоков кода и вычисления адреса перехода ни разу не встретил :(
Офлайн
Isem
Каким способом решается проблема ложных предсказаний и ветвлений в алгоритме оптимизации case?
Уточняю для остальных: я о CPU.
Офлайн
Вы специалист по ассемблеру и устройству CPU? Давайте разделим: Питон, программирование вообще, программная модель процессора и электроника. Во всех этих случаях оптимизация case совершенно разная. В каждом случае надо включать мозг и находить свое решение, и не одно.
Офлайн
Я стесняюсь спросить а зачем оптимизировать то что оптимизироваться нет смысла? Ведь ТС совсем не об этом спрашивал..
Офлайн
doza_andУ меня time.clock какую-то НЁХ возвращает. С time.time вполне константное времяt0 = time.clock() ou1= [j in val for j in rs] t1 = time.clock()
Офлайн
PanovSergeyВы правы.
Я стесняюсь спросить а зачем оптимизировать то что оптимизироваться нет смысла? Ведь ТС совсем не об этом спрашивал..
Офлайн
sergeek???
У меня time.clock какую-то НЁХ возвращает
>>> import time >>> time.clock() 5.91061322612221e-07
PanovSergeyДа для ТС это не существенно. А вот под с или с++ я довольно часто встречал диспетчеризацию сообщений в виде switch на несколько сотен, а то и тысяч пунктов. Если посмотреть выход bizon+flex то конечный автомат перехода между состояниями парсера тоже часто реализован в виде switch. А это основа многих комплияторов. Не самая главная, но существенная…
а зачем оптимизировать то что оптимизироваться нет смысла?
Отредактировано doza_and (Фев. 26, 2014 18:54:06)
Офлайн
doza_andя просто заменил в вашем time.clock на time.time
Давайте посмотрим полный код вашего скрипта.
doza_and
Вот у меня так
>>> import time >>> time.clock() 0.02 >>> time.clock() 0.02
Офлайн
doza_andэто где это ?
А вот под с или с++ я довольно часто встречал диспетчеризацию сообщений в виде switch на несколько сотен, а то и тысяч пунктов.
Офлайн