2016-10-25 2 views
0

Ich würde gerne den Computational Aufwand meiner Algorithmen schätzen, was bedeutet in diesem Fall: Wie oft ich hinzufügen, subtrahieren, multiplizieren und dividieren in meinem Algorithmus.Zählen Sie grundlegende mathematische Operationen

Beispiel:

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) 

der Ausgang der Analyse sein sollte:

1: + -> 1 mathmatical Betrieb

2: * -> 1 mathmatical Betrieb

3: +, - -> 2 mathematische Operationen

für jede Schleife sollte daher der Analysator, der mit diesem Programm läuft, zurückgeben.

+0

Warum nicht einfach aufzählen? Woher weißt du, dass es 40 ist? – QuantumFool

+0

Ich denke, das Beispiel, das Sie erwähnt haben, ist nicht das, was Sie wirklich wünschen. Wenn Sie das brauchen, erhöhen Sie die 'count' um' 4' jedes Mal, wenn Sie 'b()'? –

+0

nach jedem 'a = a + 3' put' adds = adds + 1', etc. und am Ende 'print (" + ---> ", fügt hinzu)' – furas

Antwort

1

Eine Pythonic-Lösung könnte sein, einen Operand der Klasse zu erstellen, mit zugehörigen Operatoren +, -, *, /, spezifiziert mit speziellen Methoden (__add__, __radd__, __mult__, __rmult__ usw.). Wenn Sie die "__r" -Methoden korrekt verwenden, können Sie damit beginnen, auch Literale (1, 2.0, 3.0) in nahezu beliebiger Reihenfolge zu verwenden, solange es einen Operanden gibt.

Die Klasse würde einen Zähler haben, der zum Zeitpunkt der Erstellung auf Null gesetzt wird. Jeder Aufruf addiert 1, addiert aber auch den Zähler jedes Operators (Standard = 0).

Dann könnten Sie schreiben:

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

Dann können Sie voran gehen und Ihre Mühe berechnen:

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

In der ersten Zeile, erstellen Sie das Objekt. In der zweiten Zeile ist das Ergebnis von + 3 8 und das resultierende Objekt hat eine Anstrengung von 1. In der dritten hat es eine Anstrengung von 3 (1 + 1 für a + 1 für a). In der vierten hat es einen Aufwand von 4. Etc.

Ich habe es nicht implementiert und getestet, aber es sollte mehr oder weniger nach diesen Prinzipien arbeiten.

Hinweis zu den Wertsachen: a + 2 + 3 würde Ihnen eine Zählung von 3 geben, aber 2 + 3 + a könnte Ihnen eine Zählung von 2 geben (da 5 immer noch eine Ganzzahl und kein Operand ist). Vielleicht möchten Sie die __r Methoden vermeiden, um auf der sicheren Seite zu bleiben ... es kommt darauf an.

Verwandte Themen