python / python/cpython

Method call on imported definition differs inside of a list comprehension

Aberta
#127,929 4 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

interpreter-core performance type-bug
Linguagem predominante
Python
Estrelas
77.2k
Forks
36k
Métricas de merge de PRs
Métricas de PR pendentes

Descrição

Bug report

Bug description:
import re
[x for x in [] if re.match(".*", x)]

vs:

import re
re.match(".*", x)

When you disassemble these you'll see the inlined one will be doing a LOAD_ATTR 3 (match + NULL|self) while the one outside of the comprehension will be doing a PUSH_NULL/CALL which is to disable the method call optimization on things which are likely not methods.

These should both have the same byte code. There's no perceivable code execution difference other than performance though.

CPython versions tested on:

3.12, CPython main branch

Operating systems tested on:

Linux

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Comece desmontando os dois exemplos de Python do relatório no CPython 3.12 ou em main e, em seguida, rastreie como os caminhos de chamada da compreensão de listas e de nível superior são compilados. O trabalho estará concluído quando ambas as formas usarem bytecode consistente para a chamada da definição importada sem alterar o comportamento observável.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
python
Domínio
compilers
Tipo de issue
Bug
Dificuldade
4/5
Tempo estimado
3-5 dias
Status de atividade
Estagnada
Clareza
Claramente especificada
Facilidade para iniciantes
42/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.