Переписать функцию в оптимизированном для python

#python #function #optimization

#python #функция #оптимизация

Вопрос:

Есть ли способ оптимизировать эту функцию?. Исходная версия имеет больше параметров внутри кортежей, поэтому ее невозможно масштабировать с помощью большего количества if и elif.

 from statistics import median

rule=[1,2,3]
direction=['up','down']

def function_db(mount,rule,direction):

        item=range(1,10)

        # --------------------------------------------------------------------------------
        # Porcentajes
        # --------------------------------------------------------------------------------
        if rule==1 and direction == 'up' :
            final_item = min(item)*(1 mount/100)

        elif rule==2 and direction == 'up' :
            final_item = max(item)*(1 mount/100)

        elif rule==3 and direction == 'up' :
            final_item = median(item)*(1 mount/100)

        elif rule==1 and direction == 'down' :
            final_item = min(item)*(1-mount/100)

        elif rule==2 and direction == 'down' :
            final_item = max(item)*(1-mount/100)

        elif rule==3 and direction == 'down' :
            final_item = median(item)*(1-mount/100)

        return final_item


function_db(10,3,"up")
 

Комментарии:

1. Внутри какого кортежа?

2. Вы хотите, чтобы она была оптимизирована для скорости, удобочитаемости, переносимости и т. Д.?

Ответ №1:

 from statistics import median

rule=[1,2,3]
direction=['up','down']

def function_db(mount,rule,direction):
        dic={1:min,2:max,3:median}
        direct = {'up':1,'down':-1}
        item=range(1,10)
        final_item = dic[rule](item)*(1 (mount/100)*direct[direction])
        return final_item
 

Ответ №2:

Я попытался оптимизировать макет кода (сократив количество if-else), но при этом сохранив читаемость. Я предполагаю, что правил будет намного больше, чем указаний, поэтому решил поместить правила в список функций. Таким образом, добавление нового правила включает в себя простое добавление имени функции rules .

Очевидно, что можно исключить некоторые из функционально постоянных частей multiplicand , но я подумал, что это сильно ухудшило читаемость.

Я также подумал, что стоит проверить (и вызвать) ошибки.

 from statistics import median

def function_db( mount, rule, direction ):

    item  = range( 1, 10 )
    rules = [ min, max, median ]

    if ( direction == 'up' ):
        multiplicand = ( 1 mount/100 )
    elif ( direction == 'down' ):
        multiplicand = ( 1-mount/100 )
    else:
        raise( ValueError( 'Unknown direction ['   str( direction )   ']' ) )

    if ( rule == 0 or rule > len( rules ) ):
        raise( ValueError( 'Unknown rule-code ['   str( rule )   ']' ) )


    # Compute the result
    multiplier = rules[ rule-1 ]( item )

    final_item = multiplier * multiplicand
    return final_item



print( "RESULT=%f" % ( function_db( 10, 3, "up" ) ) )
 

Ответ №3:

На самом деле это может быть даже однострочный:

 def function_db(mount,rule,direction):
     items = [0, 9, 5]
     directions = {"up": 1, "down": -1}

     return items[rule-1]*(1  directions[direction]*mount/100)
 

Комментарии:

1. не извлекайте items и directions из функции, это может привести к разрыву кода для дальнейшего процесса, написанного в основном коде, где записаны элементы и направления, лучше поддерживать инкапсуляцию.