Windows build importlib performance regression
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 77.2k
- フォーク
- 36k
- 平均マージ
- 1日 9時間
- マージ済み PR(30日)
- 558
説明
Bug report
I've a file import_models.py:
import time
from ctypes import c_longdouble
from multiprocessing import Value
def import_models_func(_, import_value, exec_value):
init = time.process_time()
import some_class
import_value.value = time.process_time() - init
exec_value.value = 0
if __name__ == '__main__':
import_models_func(0, Value(c_longdouble, lock=False), Value(c_longdouble, lock=False))
The some_class.py is:
import time
class SomeClass:
__slots__ = ('a', 'b', 'c')
def __init__(self):
self.a = time.time()
self.b = self.a / 100
self.c = self.b ** 2
B = 2
for _ in range(10):
B **= 2
@property
def a_val(self):
return self.a
@a_val.getter
def a_val(self):
return self.a
@property
def b_val(self):
return self.b
@b_val.getter
def b_val(self):
return self.b
@property
def c_val(self):
return self.c
@c_val.getter
def c_val(self):
return self.c
The directory containing both files has no __pycache__. I run python -X importtime import_models.py and receive:
import time: 521 | 521 | some_class
Then I run python -m compileall . and re-run the command above, the output is:
import time: 548 | 548 | some_class
I've tried the sampling with multiprocessing governor, which is run with -B. The governor runs this scenario for 100 times, both mean and median statistics values of the timing measured mostly provide with the same results: the timing without __pycache__ is less than when the source files are pre-compiled. Which is a non-sense keeping in mind what the pre-compiled byte-code cache is built for.
I've searched for Windows-related fixes through the versions 3.9 to 3.12 and found nothing about this regression.
Linux build in a native (non-WSL, non-emulated) environment does not have such an issue (the bytecode-compiled version gets imported faster, up to 10 times, than a raw non-compiled source)
Your environment
- CPython versions tested on: Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32
- Operating system and architecture: Windows 10 Enterprise 21H2 19044.2251
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、提供された import_models.py と some_class.py を使い、-X importtime を指定して Windows 10 でのタイミング差を再現します。次に、python -m compileall . の前後、および -B を指定した場合の実行を比較します。モジュールの読み込みに関係する importlib と Windows 固有のインポートパスを確認します。キャッシュ済みのインポートが遅くなる原因を特定し、検証済みの比較によってリグレッションを文書化または修正できれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- operating-systems, performance
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100