6

disPython のライブラリを使用して実験し、パフォーマンスを理解しようとしています。以下は、私が試した実験と結果です。

import dis

def myfunc1(dictionary):
    t = tuple(dictionary.items())
    return t

def myfunc2(dictionary, func=tuple):
    t = func(dictionary.items())
    return t

>>> dis.dis(myfunc1)

  4           0 LOAD_GLOBAL              0 (tuple)
              3 LOAD_FAST                0 (dictionary)
              6 LOAD_ATTR                1 (items)
              9 CALL_FUNCTION            0
             12 CALL_FUNCTION            1
             15 STORE_FAST               1 (t)

  5          18 LOAD_FAST                1 (t)
             21 RETURN_VALUE 

>>> dis.dis(myfunc2)

  4           0 LOAD_FAST                1 (func)
              3 LOAD_FAST                0 (dictionary)
              6 LOAD_ATTR                0 (items)
              9 CALL_FUNCTION            0
             12 CALL_FUNCTION            1
             15 STORE_FAST               2 (t)

  5          18 LOAD_FAST                2 (t)
             21 RETURN_VALUE    

今、私はそれを理解しています...

  • 左端の4&は行番号です5
  • 中央の列は、マシンによって呼び出されるオペコードです
  • 右側の列はオブジェクトです ( opargs ?)

...しかし、これはパフォーマンスに関して何を意味するのでしょうか? どちらの関数を使用するかを決定しようとしている場合dis、2 つの関数を比較するためにどのように使用しますか?

前もって感謝します。

4

1 に答える 1

4

あなた (または少なくとも普通の人) は、さまざまなアセンブリ コードを見て、どちらが高速かを判断することはできません。

IPython の %%timeit マジック関数を試してください。

コードの一部が自動的に数回実行され、客観的な回答が得られます。

最近、Python でこの種のものを測定する方法を教えているこのブログ投稿を見つけました。時間だけでなく、メモリ使用量も。この投稿のハイライト (少なくとも私にとっては) は、%lprun マジック関数の実装を教えているときです。

これを使用すると、関数を行ごとに見ることができ、それぞれが費やした合計時間にどれだけ貢献しているかを正確に知ることができます。

数週間使用していますが、とても良いです。

于 2013-10-11T17:35:10.813 に答える