Форум сайта python.su
0
Привет, всем
Подскажите пожалуйста, есть ли возможность, оптимизировать по скорости, вот эту функцию 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 #---------------------------------------------------------------------------------------------------------
Офлайн
221
Dobrodel
приложите тестовый кортеж args - так быстрее пойдет процесс
Офлайн
0
# Функция для вычисления среднего времени запуска трестируемой программы 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)
Офлайн
0
Можно попробовать сделать фиксированный формат входных данных и убрать вызов isinstance — эта проверка может много хавать. Как альтернатива, заменить на прямую проверку родительского класса: if x.__class__ is Y, но так делать плохо.
Офлайн
0
Благодарю за ответ.
Убрав isinstance( x, tuple ): получил вот такой результат
493 tic. for getContext Result: ...
Отредактировано Dobrodel (Янв. 9, 2015 17:09:22)
Офлайн
0
Везде убрать лишние множества, например, это:
itruple |= set( y.split() )
заменить на:
itruple.update( y.split() )
Офлайн
0
Благодарю
Офлайн