2016-10-25 10 views
0

Я хотел бы угадать вычислительное усилие моих алгоритмов, то есть в этом случае: Как часто я добавляю, вычитаю, умножаю и делю в моем алгоритме.Подсчитать основные математические операции

Пример:

def b(a): 
    a = a + 3 #1 
    a = a * a #2 
    a = a * -1 #3 
    return a 

if __name__ == "__main__": 
    for i in range(10): 
     b(1) 

выводе анализа должно быть:

1 + -> 1 mathmatical операции

2: * -> 1 mathmatical эксплуатация

3: +, - -> 2 математические операции

для каждого цикла, поэтому анализатор, запускаемый в этой программе, должен возвращать .

+0

Почему бы просто не посчитать это? Кроме того, как вы знаете, что это 40? – QuantumFool

+0

Я думаю, что пример, который вы упомянули, не то, что вы действительно хотите. Если это то, что вам нужно, увеличивайте 'count' на' 4' каждый раз, когда вы вызываете 'b()'? –

+0

после каждого 'a = a + 3' put' добавляет = добавляет +1, и т. Д. и в конце 'print (« + ---> »добавляет)' – furas

ответ

1

Решение Pythonic может состоять в том, чтобы создать операнд класса с ассоциированными операторами +, -, *, /, заданными специальными методами (__add__, __radd__, __mult__, __rmult__ и т. Д.). Если вы правильно используете методы «__r», вы можете начать также включать литеры (1, 2.0, 3.0) практически в любом порядке, если есть один операнд.

Класс будет иметь счетчик, установленный на ноль во время создания. Каждый вызов добавляет 1, но также добавляет счетчик каждого оператора (по умолчанию = 0).

Тогда вы могли бы написать:

a = Operand(2) 
b = a+2-5 
assert b.effort == 3 

Тогда вы можете пойти дальше и рассчитать усилие:

a = Operand(5) 
a = a + 3 #1 
a = a * a #2 
a = a * -1 #3 
print(a.effort) 

В первой строке создается объект. Во второй строке результат a + 3 равен 8, а полученный объект имеет усилие 1. В третьих, он имеет усилие 3 (1 + 1 для a + 1 для a). В четвертом случае он прилагает усилия 4. И т.д.

Я не реализовал и не тестировал его, но он должен работать более или менее в соответствии с этими принципами.

Примечание о litterals: а + 2 + 3 даст вам кол-3, но 2 + 3 + а может дать вам кол-2 (с 5 по-прежнему является целым числом, а не Операнд). Поэтому, возможно, вы хотите избежать методов __r, чтобы оставаться на безопасной стороне ... это зависит.

Смежные вопросы