Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 8, 2015 05:32:55

Dobrodel
Зарегистрирован: 2014-09-24
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация кода

Привет, всем
Подскажите пожалуйста, есть ли возможность, оптимизировать по скорости, вот эту функцию getContext:

def toUpper( text ):
    buff = text.decode( 'UTF-8', 'ignore' )
    return buff.upper().encode( 'UTF-8', 'ignore' )
def toLower( text ):
    buff = text.decode( 'UTF-8', 'ignore' )
    return buff.lower().encode( 'UTF-8', 'ignore' )
#--------------------------------------------------------------------------------
#
#    Функция возвращает список уникальных значений в виде множества (set)
#    из переданных аргументов, которые раздроблены на слова длинна
#    которых первышает 2 символа
#
#--------------------------------------------------------------------------------
UPPER = 0
LOWER = 1
def getContext( capitalize = UPPER, *args ):
    if not args: return None
    itruple = set()
    itstr = ''
    for x in args:                                      #  Проход по всем передаваемым аргументам
        if isinstance( x, tuple ):                      #  Проверка на передачу кортежа
            for y in x:                                 #  Проход по кортежу
                if isinstance( y, str ):                #  Вы бираем только тектстовые поля
                    itruple |= set( y.split() )         #  Делим текст на слова и объединяем в одно множетсво
        else:
            itstr = "{0} {1}".format( itstr, x )        #  В случае передачи строк объединяем в одну строку
            itruple |= set( itstr.split() )             #  Делим текст на слова и объединяем в одно множетсво
    #  Формируем сет для ускорения в нем поиска из всех слов что больше 2 символов
    context = {toUpper( x ) if capitalize == UPPER  else toLower( x ) for x in itruple if len( x ) > 2 }
    return context
#---------------------------------------------------------------------------------------------------------

Офлайн

#2 Янв. 8, 2015 07:01:08

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Оптимизация кода

Dobrodel
приложите тестовый кортеж args - так быстрее пойдет процесс



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Янв. 8, 2015 09:17:55

Dobrodel
Зарегистрирован: 2014-09-24
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация кода

# Функция для вычисления среднего времени запуска трестируемой программы
def testTime( func, *args ):
    maxhops = 1000
    sum = 0
    for x in range( 1, maxhops ):
        test = time()
        res = func( *args )
        test1 = time()
        sum += int( ( test1 - test ) * 1000000 )
    print "{time} tic. for {fn} Result: '{res}'".format( time = str( sum / maxhops ), fn = func.__name__ , res = res )
if __name__ == '__main__':
    sentance1 = 'Однажды в студеную зимнюю пору'
    sentance2 = 'я из лесу вышел был сильный мороз'
    sentance3 = 'гляжу поднимается медленно в гору лошадка везущая хворосту воз'
    sentance4 = 'И шествуя важно с походкою чинной лошадку ведет под узцы мужичек'
    testTuple = tuple( [sentance1, sentance2, sentance3, sentance4, 123123321, 4123432432] )
# Запуск с tuple
    testTime(getContext, UPPER, testTuple)
# Запуск со строками
    testTime( getContext, UPPER, sentance1, sentance2, sentance3, sentance4)

# Запуск с tuple
504 tic. for getContext Result: ....
# Запуск со строками
532 tic. for getContext Result: ....

Отредактировано Dobrodel (Янв. 8, 2015 16:28:20)

Офлайн

#4 Янв. 8, 2015 10:03:38

Tiendil
Зарегистрирован: 2014-09-23
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация кода

Можно попробовать сделать фиксированный формат входных данных и убрать вызов isinstance — эта проверка может много хавать. Как альтернатива, заменить на прямую проверку родительского класса: if x.__class__ is Y, но так делать плохо.



разработчик MMOZPG «Сказка» — http://the-tale.org

Офлайн

#5 Янв. 9, 2015 17:09:06

Dobrodel
Зарегистрирован: 2014-09-24
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация кода

Благодарю за ответ.
Убрав isinstance( x, tuple ): получил вот такой результат

493 tic. for getContext Result: ...
НЕ очень впечатляет…
Может есть еще мысли?

Отредактировано Dobrodel (Янв. 9, 2015 17:09:22)

Офлайн

#6 Янв. 9, 2015 17:20:32

Tiendil
Зарегистрирован: 2014-09-23
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация кода

Везде убрать лишние множества, например, это:

itruple |= set( y.split() )

заменить на:

itruple.update( y.split() )



разработчик MMOZPG «Сказка» — http://the-tale.org

Офлайн

#7 Янв. 10, 2015 06:07:54

Dobrodel
Зарегистрирован: 2014-09-24
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация кода

Благодарю

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version