Nie, to nieprawda .
Kompilacja do kodu bajtowego CPythona jest przekazywana tylko przez mały optymalizator wizjera, który jest przeznaczony do wykonywania tylko podstawowych optymalizacji (patrz test_peepholer.py w zestawie testów, aby uzyskać więcej informacji na temat tych optymalizacji).
Aby zobaczyć, co naprawdę się wydarzy, użyj dis
*, aby zobaczyć wygenerowane instrukcje. Dla pierwszej funkcji zawierającej przypisanie:
from dis import dis
dis(func)
2 0 LOAD_CONST 1 (42)
2 STORE_FAST 0 (a)
3 4 LOAD_FAST 0 (a)
6 RETURN_VALUE
Natomiast dla drugiej funkcji:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
Dwie kolejne (szybkie) instrukcje są używane w pierwszej: STORE_FAST
i LOAD_FAST
. Tworzą one szybkie zapisywanie i pobieranie wartości w fastlocals
tablicy bieżącej ramki wykonania. Następnie w obu przypadkach RETURN_VALUE
wykonywany jest a . Tak więc druga jest bardzo nieznaczna szybsza ze względu na mniej poleceń potrzebnych do wykonania.
Ogólnie należy pamiętać, że kompilator CPython jest konserwatywny w optymalizacjach, które wykonuje. Nie jest i nie stara się być tak sprytny, jak inne kompilatory (które generalnie mają również znacznie więcej informacji do pracy). Głównym celem projektu, oprócz oczywistej poprawności, jest a) zachowanie prostoty i b) jak najszybsza kompilacja ich, aby nawet nie zauważyć, że istnieje faza kompilacji.
W końcu nie powinieneś martwić się drobnymi problemami, takimi jak ten. Korzyść w szybkości jest niewielka, stała i przyćmiona przez narzut wynikający z faktu, że Python jest interpretowany.
* dis
to mały moduł Pythona, który dezasembluje Twój kod, możesz go użyć, aby zobaczyć kod bajtowy Pythona, który wykona maszyna wirtualna.
Uwaga: jak stwierdzono również w komentarzu @Jorn Vernee, jest to specyficzne dla implementacji Pythona w CPythonie. Inne implementacje mogą wykonywać bardziej agresywne optymalizacje, jeśli sobie tego życzą, CPython nie.
dis.dis(..)
obu, zobaczysz, że istnieje różnica , więc tak. Ale w większości rzeczywistych aplikacji narzut tego w porównaniu z opóźnieniem przetwarzania w funkcji nie jest tak duży.