2010-11-22 62 views
6

私は最近、[]の代わりにlist()dict()tuple(){}、および()の代わりに、3つのうちの空のものを作成する必要があると考えました。その理由は、より読みやすいように見えるということです。私はそのスタイルに関する意見を聞くつもりでしたが、パフォーマンスをテストすることにしました。私はdict()tuple()list()を試してみましたが、それぞれの関数呼び出しのバージョンは構文バージョン({}[]())よりも非常に悪かったlist()、dict()、tuple()が[]、{}、()よりも遅いのはなぜですか?

>>> from timeit import Timer 
>>> Timer('for x in range(5): y = []').timeit() 
0.59327821802969538 
>>> from timeit import Timer 
>>> Timer('for x in range(5): y = list()').timeit() 
1.2198944904251618 

だから、私は3つの質問があります:私はこれをしなかった

  1. なぜ関数呼び出しがより高価なのですか?
  2. なぜそれほど大きな違いがありますか?
  3. タイマーに空のリストを5つ作成するのに1.2秒かかるのはなぜですか?私はtimeitがガベージコレクションを無効にしていることを知っていますが、それはおそらくrange(5)を使用したと考えると効果がありませんでした。
+0

re:スタイル意見 - 私はかなり頻繁に使います。私はそれが十分明確だと思う。パフォーマンスの問題は面白いです。 – nmichaels

+0

あなたがそれらに慣れてしまうまで、Pythonについて奇妙に見える多くのものがあります。 'list()'は実際に '__builtins __。list'でないかもしれないので、常に' [] 'を' 'list()'にしたいと思います。バイヤーは注意してください。 – SingleNegationElimination

答えて

18

関数呼び出しには、変数名のルックアップとそれに続く関数呼び出しが必要です。呼び出された関数はリストを作成して返します。 #3に答えるために

>>> import dis 
>>> foo = lambda :[] 
>>> bar = lambda :list() 
>>> dis.dis(foo) 
    1   0 BUILD_LIST    0 
       3 RETURN_VALUE   
>>> dis.dis(bar) 
    1   0 LOAD_GLOBAL    0 (list) 
       3 CALL_FUNCTION   0 
       6 RETURN_VALUE   
>>> 
0

スコープ検索はdicttuple、およびlistを見つけるために必要とされており、複数のスコープは、それらを見つけるために検索する必要があります。構文的な砂糖を使用すると、コンパイラは特定のオブジェクトを作成する必要があることを知ることができ、そうするために適切なバイトコードを発行することができます。

+1

'[]'は何の構文砂糖でもありません。これはリストリテラルです。 – SingleNegationElimination

+0

@TokenMacGuy:それは確かに構文的な砂糖です。リストは 'list()'を呼び出すことによって生成することができますが、コンパイラは適切なコンテキストで角括弧をリストの作成として解釈します。 –

+2

コンパイラは '[]'に出会ったときに 'not(*)*' list()を呼び出しません。私の答えを見てください。ありがとう。 – SingleNegationElimination

2
>>> from dis import dis 

    >>> dis(lambda: list()) 
    1   0 LOAD_GLOBAL    0 (list) 
       3 CALL_FUNCTION   0 
       6 RETURN_VALUE   

    >>> dis(lambda: []) 
    1   0 BUILD_LIST    0 
       3 RETURN_VALUE   
5

:リストリテラル構文は、単にリストを作成するインタプリタを取得します。

timeitは、デフォルトでプログラムを1 000 000回実際に繰り返します。実際、1.2秒で500万のリストを作成しています。

+0

私は次回RTFMする必要があります:) – orokusaki

関連する問題