Timer(superMegaIntenseFunction(10))bedeutet "anrufen superMegaIntenseFunction(10), dann das Ergebnis an übergeben Timer". Das ist eindeutig nicht das, was du willst. Timererwartet entweder einen aufrufbaren (so wie es sich anhört: etwas, das aufgerufen werden kann, wie eine Funktion) oder einen String (damit der Inhalt des Strings als Python-Code interpretiert werden kann). Timerfunktioniert, indem Sie das aufrufbare Ding wiederholt aufrufen und sehen, wie viel Zeit benötigt wird.
Timer(superMegaIntenseFunction)würde die Typprüfung bestehen, da superMegaIntenseFunctionaufrufbar ist. Ich Timerwürde jedoch nicht wissen, an welche Werte übergeben werden soll superMegaIntenseFunction.
Der einfache Weg, dies zu umgehen, besteht natürlich darin, eine Zeichenfolge mit dem Code zu verwenden. Wir müssen ein 'Setup'-Argument an den Code übergeben, da die Zeichenfolge in einem neuen Kontext "als Code interpretiert" wird - sie hat keinen Zugriff darauf globals, sodass Sie ein weiteres Stück Code ausführen müssen, um die Definition zu erstellen verfügbar - siehe Antwort von @ oxtopus.
Mit lambda(wie in der Antwort von @ Pablo) können wir den Parameter 10an einen Aufruf von binden superMegaIntenseFunction. Alles , was wir tun , eine andere Funktion schafft, die keine Argumente übernimmt, und fordert superMegaIntenseFunctionmit 10. Es ist so, als hätten Sie defeine andere Funktion wie diese erstellt, nur dass die neue Funktion keinen Namen erhält (weil sie keinen benötigt).