Уведомления

Группа в Telegram: @pythonsu

#1 Март 29, 2012 17:52:30

dingo
Зарегистрирован: 2012-03-29
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Медленное выполнение программы

Какие существуют стандартные способы ускорения программы написанной на python2.7 ?

Офлайн

#2 Март 29, 2012 19:08:18

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Медленное выполнение программы

Поиск “узких” мест, их оптимизация и распараллеливание.



Офлайн

#3 Март 29, 2012 21:26:01

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2267
Репутация: +  41  -
Профиль   Отправить e-mail  

Медленное выполнение программы

запуск на pypy - это модно

Офлайн

#4 Март 30, 2012 00:44:17

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Медленное выполнение программы

профайлер пробовали?



Офлайн

#5 Март 30, 2012 21:35:32

dingo
Зарегистрирован: 2012-03-29
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Медленное выполнение программы

А можно по подробней про распараллеливание и профайлер
Запустить на pypy нет возможности
Нужно написать программу которая проверяет правильность раставления скобок менять алгоритм пробовал не помогло , ограничения по времени 2сек

Офлайн

#6 Март 30, 2012 22:02:09

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

Медленное выполнение программы

dingo
менять алгоритм пробовал не помогло , ограничения по времени 2сек
Какой объем текста?
Какие алгоритмы пробовали? (в вашем случае допустимо и весь алгоритм привести).



Офлайн

#7 Март 30, 2012 22:12:57

dingo
Зарегистрирован: 2012-03-29
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Медленное выполнение программы

объем текста от 1 до 120000 символов

f=open("brackets.in")
l=f.read()
def proverka(masiv,steck):
	bool="True"
	for q in masiv:
		if q=="(" or q=="[" or q=="{":
			steck.insert(0,q)
		else:
			if q=="]" and steck[0]=="[":
				del(steck[0])
			elif  q==")" and steck[0]=="(":
				del(steck[0])
			elif q=="}" and steck[0]=="{":
				del(steck[0])
			else:
				otvet="NO"
				bool="False"
				break
	if bool=="True":
		if len(steck)==0:
			otvet="YES"
		else:
			otvet="NO"
	return otvet
if len(l)%2==0:
	steck=[l[0]]
	otvet=proverka(l[1::],steck)
else:
	otvet="NO"
f1=open("brackets.out","w")
f1.write(otvet)
f1.close()

Офлайн

#8 Март 31, 2012 00:09:37

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Медленное выполнение программы

bool="True"
...
if q=="(" or q=="[" or q=="{":
...
otvet="NO"
bool="False"
...
if bool=="True":

Вам пока противопоказан python :(

Да и алгоритм у вас неверный - на последовательность “(())” он работать не будет.



Отредактировано fata1ex (Март 31, 2012 00:11:09)

Офлайн

#9 Март 31, 2012 11:45:03

dingo
Зарегистрирован: 2012-03-29
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Медленное выполнение программы

Вы не поверите но на этой последовательности он прекрасно работает

Офлайн

#10 Март 31, 2012 13:27:02

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Медленное выполнение программы

Да, согласен.

В таком случае пара очевидных советов:
1. Добавление элемента в начало листа намного медленнее, чем добавление в конец.
2. Непонятно, зачем вызывать del.
3. Стиль кода ужасен :(

def correct_brackets(sequence):
    open_brackets  = "({["
    close_brackets = ")}]"
    stack = []
    for bracket in sequence:
        try:
            if bracket in open_brackets:
                stack.append(bracket)
            elif open_brackets.index(stack.pop()) == close_brackets.index(bracket):
                pass
            else:
                return False
        except (ValueError, IndexError):
            return False
    if stack:
        return False
    return True

Я бы написал что-нибудь в этом роде. Можете подумать, как упростить выражение после elif. Возможно, тут лучше будет использовать словарь или еще что-нибудь. Так же можете убрать ValueError в try-except, если вам не нужна проверка на корректность скобочной последовательности в смысле набора символов.

Если грубо:
seq = "(([[{{}}]]))"
time_before = time.time()
for _ in range(100000):
    correct_brackets(seq)
print time.time() - time_before

>>> ~2.13

Со словарем и правда побыстрее:

>>> ~1.39

Извращение, конечно, но лучше мне ничего пока в голову не пришло :)
open_brackets  = {'(':1, '{':2, '[':3}
close_brackets = {')':1, '}':2, ']':3}

Как итог:
def correct_brackets(sequence):
    open_brackets       = "({["
    dict_open_brackets  = {'(':1, '{':2, '[':3}
    dict_close_brackets = {')':1, '}':2, ']':3}
    stack = []
    for bracket in sequence:
        try:
            if bracket in open_brackets:
                stack.append(bracket)
            elif dict_open_brackets[stack.pop()] == dict_close_brackets[bracket]:
                pass
            else:
                return False
        except (ValueError, IndexError):
            return False
    if stack:
        return False
    return True

in dict.keys() будет медленее обычного in seq, поэтому оставил open_brackets. Вряд ли от вас потребуют что-нибудь намного более быстрое, чем этот вариант. Удачи!



Отредактировано fata1ex (Март 31, 2012 14:05:14)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version