Ні, це не так .
Компіляція до байтового коду CPython передається лише через невеликий оптимізатор видовища, який призначений для виконання лише базових оптимізацій ( докладнішу інформацію про ці оптимізації див. У тестовому наборі test_peepholer.py ).
Щоб ознайомитись з тим, що насправді відбуватиметься, використовуйте dis
*, щоб переглянути створені інструкції. Для першої функції, що містить призначення:
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
Хоча для другої функції:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
У першій застосовуються ще дві (швидкі) інструкції: STORE_FAST
і LOAD_FAST
. Вони роблять швидке зберігання та захоплення значення в fastlocals
масиві поточного кадру виконання. Потім в обох випадках RETURN_VALUE
виконується а. Отже, другий стає дещо швидшим за рахунок меншої кількості команд, необхідних для виконання.
Загалом, майте на увазі, що компілятор CPython є консервативним в оптимізаціях, які він виконує. Він не є і не намагається бути таким розумним, як інші компілятори (з якими, як правило, також є набагато більше інформації для роботи). Основна мета дизайну, окрім очевидності правильної, полягає в тому, щоб: а) зберігати її просто і б) бути максимально швидкою при складанні цих матеріалів, щоб ви навіть не помітили, що існує фаза компіляції.
Зрештою, ви не повинні турбувати себе з такими дрібними проблемами, як ця. Користь у швидкості невелика, постійна і, карликована накладними, спричиненими тим, що Python інтерпретується.
* dis
це невеликий модуль Python, який розбирає ваш код, ви можете використовувати його, щоб побачити байт-код Python, який буде виконувати VM.
Примітка: Як також зазначалося в коментарі @Jorn Vernee, це специфічно для CPython реалізації Python. Інші реалізації можуть зробити більш агресивні оптимізації, якщо вони цього хочуть, CPython цього не робить.
dis.dis(..)
обидва, ви бачите, що є різниця , так що так. Але в більшості реальних застосувань рентабельність цього порівняно із затримкою обробки у функції не така вже й велика.