python / python/cpython

Method call on imported definition differs inside of a list comprehension

オープン
#127,929 コメント 4 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

interpreter-core performance type-bug
主要言語
Python
スター
77.2k
フォーク
35.9k
PR マージ指標
PR 指標を取得中

説明

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

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず、CPython 3.12 または main 上でレポートにある 2 つの Python の例を逆アセンブルし、次に list-comprehension とトップレベル呼び出しのパスがどのようにコンパイルされるかを追跡します。完了条件は、観測可能な動作を変更せずに、どちらの形式もインポートされた定義の呼び出しに一貫したバイトコードを使用することです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
compilers
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
42/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。