1

Pythonでdissembler関数に出くわしました。しかし、私はそれが何を意味するのか理解できませんでした。階乗関数の結果に基づいて(再帰とループに基づいて)、誰でも作業と使用を説明できますか

再帰コードと対応するディスコード:

>>> def fact(n):
...     if n==1:
...             return 1
...     return n*fact(n-1)
... 
>>> dis.dis(fact)
2           0 LOAD_FAST                0 (n)
          3 LOAD_CONST               1 (1)
          6 COMPARE_OP               2 (==)
          9 POP_JUMP_IF_FALSE       16
3          12 LOAD_CONST               1 (1)
         15 RETURN_VALUE        
4     >>   16 LOAD_FAST                0 (n)
         19 LOAD_GLOBAL              0 (fact)
         22 LOAD_FAST                0 (n)
         25 LOAD_CONST               1 (1)
         28 BINARY_SUBTRACT     
         29 CALL_FUNCTION            1
         32 BINARY_MULTIPLY     
         33 RETURN_VALUE        

そして、ループを使用した階乗関数は、次の結果をもたらします。

def factor(n):
...     f=1
...     while n>1:
...             f*=n
...             n-=1
... 
>>> dis.dis(factor)
2           0 LOAD_CONST               1 (1)
          3 STORE_FAST               1 (f)

3           6 SETUP_LOOP              36 (to 45)
    >>    9 LOAD_FAST                0 (n)
         12 LOAD_CONST               1 (1)
         15 COMPARE_OP               4 (>)
         18 POP_JUMP_IF_FALSE       44

4          21 LOAD_FAST                1 (f)
         24 LOAD_FAST                0 (n)
         27 INPLACE_MULTIPLY    
         28 STORE_FAST               1 (f)

5          31 LOAD_FAST                0 (n)
         34 LOAD_CONST               1 (1)
         37 INPLACE_SUBTRACT    
         38 STORE_FAST               0 (n)
         41 JUMP_ABSOLUTE            9
    >>   44 POP_BLOCK           
    >>   45 LOAD_CONST               0 (None)
         48 RETURN_VALUE        

どちらが速いかを判断する方法を誰か教えてもらえますか?

4

3 に答える 3

6

バイトコードを見るだけでは、どちらが高速かを判断することはできません。各 VM は各オペコードに関連するコストが異なるため、実行時間は大きく異なる可能性があります。

于 2013-06-12T04:07:59.037 に答える
6

何かの実行速度を測定するtimeitには、Python に付属のモジュールを使用します。

モジュールは、バイトコードどのように見えるdisかを知るために使用されます。そしてそれはcpythonに非常に固有のものです。

用途の 1 つは、ループまたはメソッド内の変数に、いつ、どのようにストレージが割り当てられているかを確認することです。ただし、これは通常、効率計算には使用されない特殊なモジュールです。timeit何かがどれだけ速いかを把握し、内部で何が起こっているかを理解するために使用します - 考えられる理由disに到達する.

于 2013-06-12T04:10:44.867 に答える
0

このdis.dis()関数は、関数をそのバイトコード解釈に逆アセンブルします。

タイミング

Ignacio が述べたように、バイトコードの純粋な長さは、Python インタープリターが実際にオペコードを実行する方法の違いとtimeitモジュールがそこで使用したいものになるため、実行時間を正確に表していません。

実際の目的

この関数にはいくつかの用途がありますが、ほとんどの人が最終的に行うものではありません。速度の問題を最適化またはデバッグするプロセスの一部として役立つ出力を確認できます。また、Python インタープリターで直接作業したり、独自のインタープリターを作成したりする場合にも役立つ可能性があります。オペコードの完全なリストについては、こちらのドキュメントを参照してください (ただし、そのページに記載されているように、Python のバージョン間で変更される可能性は十分にあります)。

全体として、これは実稼働アプリケーションで実際に使用するものではありません (アプリケーションが python 逆アセンブラーでない限り!) が、コードを最適化し、最下位レベルでデバッグする必要がある場合は、ここで関数を使用します。便利です。

于 2013-06-12T04:23:14.857 に答える