Hayır değil .
CPython bayt kodunun derlenmesi, yalnızca temel optimizasyonları gerçekleştirmek için tasarlanmış küçük bir gözetleme deliği optimize ediciden geçirilir ( Bu optimizasyonlar hakkında daha fazla bilgi için test paketindeki test_peepholer.py'ye bakın ).
Gerçekte ne olacağına bakmak için, dis
oluşturulan talimatları görmek için * kullanın. Atamayı içeren ilk işlev için:
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
İkinci işlev için ise:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
İlkinde iki (hızlı) talimat daha kullanılır: STORE_FAST
ve LOAD_FAST
. Bunlar, hızlı bir şekilde depolanır ve fastlocals
geçerli yürütme çerçevesinin dizisindeki değeri alır . Daha sonra her iki durumda da a RETURN_VALUE
gerçekleştirilir. Yani, ikinci zamankinden böyledir biraz daha hızlı çalıştırmak için gereken daha az komutları nedeniyle.
Genel olarak, CPython derleyicisinin gerçekleştirdiği optimizasyonlarda tutucu olduğunu unutmayın. Diğer derleyiciler kadar akıllı değildir ve olmaya çalışmaz (genel olarak üzerinde çalışacak çok daha fazla bilgi vardır). Açıkça doğru olmanın yanı sıra ana tasarım hedefi, a) basit tutmak ve b) bunları derlerken olabildiğince hızlı olmaktır, böylece bir derleme aşamasının var olduğunu bile fark etmezsiniz.
Sonunda, bunun gibi küçük sorunlarla uğraşmamalısın. Hızdaki fayda minik, sabittir ve Python'un yorumlanması gerçeğinin getirdiği ek yükten çok daha azdır.
* dis
kodunuzu parçalara ayıran küçük bir Python modülüdür, onu sanal makinenin çalıştıracağı Python bayt kodunu görmek için kullanabilirsiniz.
Not: @Jorn Vernee tarafından yapılan bir yorumda da belirtildiği gibi, bu Python'un CPython uygulamasına özgüdür. CPython isterlerse diğer uygulamalar daha agresif optimizasyonlar yapabilir.
dis.dis(..)
ikisinde de kullanırsanız , bir fark olduğunu görürsünüz , yani evet. Ancak çoğu gerçek dünya uygulamasında, işlevdeki işlemenin gecikmesine kıyasla bunun ek yükü o kadar değildir.