Existe alguma diferença final entre os dois trechos de código a seguir? O primeiro atribui um valor a uma variável em uma função e, em seguida, retorna essa variável. A segunda função apenas retorna o valor diretamente.
O Python os transforma em bytecode equivalente? É um deles mais rápido?
Caso 1 :
def func():
a = 42
return a
Caso 2 :
def func():
return 42
python
interpreter
python-internals
Jayesh
fonte
fonte
dis.dis(..)
em ambos, verá que há uma diferença , então sim. Mas, na maioria dos aplicativos do mundo real , a sobrecarga disso em comparação com o atraso do processamento na função não é muito.Respostas:
Não, não importa .
A compilação para o código de byte CPython é passada apenas por um pequeno otimizador de olho mágico que é projetado para fazer apenas otimizações básicas (consulte test_peepholer.py no conjunto de testes para mais informações sobre essas otimizações).
Para ver o que realmente vai acontecer, use
dis
* para ver as instruções geradas. Para a primeira função, contendo a atribuição:Enquanto, para a segunda função:
Mais duas instruções (rápidas) são usadas na primeira:
STORE_FAST
eLOAD_FAST
. Isso faz um armazenamento rápido e captura do valor nafastlocals
matriz do quadro de execução atual. Então, em ambos os casos, aRETURN_VALUE
é executado. Portanto, o segundo é ligeiramente mais rápido devido a menos comandos necessários para executar.Em geral, esteja ciente de que o compilador CPython é conservador nas otimizações que realiza. Não é e não tenta ser tão inteligente quanto os outros compiladores (que, em geral, também têm muito mais informações para trabalhar). O principal objetivo do design, além de obviamente estar correto, é a) mantê-lo simples eb) ser o mais rápido possível na compilação para que você nem perceba que existe uma fase de compilação.
No final, você não deve se preocupar com pequenos problemas como este. O benefício na velocidade é mínimo, constante e, diminuído pela sobrecarga introduzida pelo fato de que o Python é interpretado.
*
dis
é um pequeno módulo Python que desmonta seu código, você pode usá-lo para ver o bytecode Python que a VM executará.Nota: Como também afirmado em um comentário de @Jorn Vernee, isso é específico para a implementação CPython do Python. Outras implementações podem fazer otimizações mais agressivas se assim o desejarem, o CPython não.
fonte
Ambos são basicamente iguais, exceto que, no primeiro caso, o objeto
42
é simplesmente atribuído a uma variável nomeadaa
ou, em outras palavras, nomes (isto éa
) referem-se a valores (isto é42
). Ele não faz nenhuma atribuição tecnicamente, no sentido de que nunca copia nenhum dado.Enquanto
return
ing, esta ligação nomeadaa
é retornada no primeiro caso, enquanto o objeto42
é retornado no segundo caso.Para mais leitura, consulte este ótimo artigo de Ned Batchelder
fonte