数学講師2886596 views
世界の国564562 views
中学数学623778 views
高校生物551780 views
MathPython497416 views
りんご209693 views
小学理科719898 views
中学理科1630686 views
ヒストリア290629 views
小学社会310495 views
Help
Tools
NewsSpreadsheetCalendarBookkeepingMarkdown TablesLanguage Model NewsSlidesTier ListPen ToolIllustrationCrayonWatercolorPixel ArtASCII ArtPerspectiveEndless StairsGraphMind MapER DiagramFamily TreeMemeCurved TextImage EditorMosaicRetro FilterPencil SketchSwirl EffectLine ArtOCR/HighlighterMakeup EditorFaviconVideo TrimmerScrolling VideoVideo TitleColor PickerColor ExtractorBonfireFireworksCherry BlossomWater RippleWater SplashBreaking GlassGlass TextureFabric TextureWood GrainMarble TextureBrick Wall TextureMetal TextureWashi Paper TextureCardboard TextureCSS ButtonIcon MakerBar ChartGrouped Bar ChartStacked Bar ChartPie ChartLine ChartArea ChartStacked Area ChartScatter Plot3D Bar Chart3D Pie ChartBar Chart RaceBubble ChartPopulation PyramidPictogramEarningsCandlestick ChartInvestment RiskMortgage SimulatorCalculatorMatrix CalculatorFunction GraphPolynomial ExpansionVenn DiagramField VisualizerRubik's Cube Group TheoryTraveling SalesmanVoronoi and DelaunayFractalColumn ArithmeticDraw Math FiguresArithmetic AnimationArithmetic Word ProblemsCounting with Tree DiagramsCube NetsRolling DiceCross SectionsMotion PathMechanicsWavesElectromagnetic WavesCapacitorsLight and LensesThermodynamicsHow Semiconductors WorkMolecular StructuresAtomic OrbitalsElectrochemical CellsChemical EquilibriumCrystal LatticesBuffer pHOrganic Reaction MapPeriodic TableComplex IonsDNA Double HelixCell DivisionMembrane ChannelsNerve ImpulseMuscle ContractionHormones and HomeostasisRock ClassificationWeatherConstellationsSolar and Lunar Eclipses3D ModelingFloor PlanSeismic StructuresIntersection TurnMaglevCooking AnimationOrigamiLive Viewer CountGeoJSON MapRailway MapPopulation MapCrime MapLand Price MapSchool MapShrine and Castle MapHouse of Representatives MapWord MapSolitaireReversiHakoiri MusumeChessHamburgerRippleSlide Puzzle MakerNeon PinballNovel MakerJapanese Typing PracticePiano Score EditorMusic TheoryShogi StrategyPiano Rhythm Game

English

Python のバイトコード(dis モジュール)で関数を解剖する

dis モジュールを使うと、Python 関数がどのようなバイトコードにコンパイルされるかを確認できます。パフォーマンス最適化やインタプリタの動作理解に有用です。

基本的な使い方

import dis

def add(a, b):
    return a + b

dis.dis(add)

出力例:

2           0 LOAD_FAST                0 (a)
              2 LOAD_FAST                1 (b)
              4 BINARY_ADD
              6 RETURN_VALUE

各行は「行番号、オフセット、命令、引数」を示します。

命令の意味

LOAD_FASTローカル変数をスタックにプッシュ
LOAD_CONST定数をスタックにプッシュ
BINARY_ADDスタックから 2 つポップして加算
RETURN_VALUEスタックトップを返す
CALL_FUNCTION関数呼び出し
STORE_FASTスタックトップをローカル変数に格納

ループの解析

def sum_list(items):
    total = 0
    for item in items:
        total += item
    return total

dis.dis(sum_list)

FOR_ITER や JUMP_BACKWARD などのジャンプ命令が現れます。

条件分岐の解析

def check(x):
    if x > 0:
        return "positive"
    else:
        return "non-positive"

dis.dis(check)

POP_JUMP_IF_FALSE など条件付きジャンプが使われます。

最適化の確認

def constant_folding():
    return 2 + 3

dis.dis(constant_folding)

定数畳み込みにより、コンパイル時に 5 に計算されていることがわかります。

Bytecode オブジェクト

より詳細な解析には Bytecode クラスを使います。

from dis import Bytecode

for instr in Bytecode(add):
    print(f"{instr.opname:20} {instr.argrepr}")

バイトコードの理解は、なぜ特定のコードが遅いのか、最適化がどう適用されるかを知る手がかりになります。