5

リストがあるとだけ言って

a = (3, 2, 9, 4)

そして、各数値に1を追加して結果を保存したい(後で結果を操作する必要はありません)、私の最初の考えは次のようになるでしょう:

[x + 1 for x in a]

しかし、どうですか:

tuple(x + 1 for x in a)

タプルは高速化するためのものですよね? そして、結果を変更する必要がない場合、このコードはより効率的ですか? また、実際にはどのように機能しますtupleか?コンストラクターは、サイズを事前に知るためにジェネレーター式からリストを作成する必要がありますか? 説明をよろしくお願いします。

4

3 に答える 3

3

モジュールはdis、コードが内部でどのように実行されるかについてのアイデアを提供します...

dis.dis(lambda a: [x + 1 for x in a])収量...

  1           0 BUILD_LIST               0
              3 LOAD_FAST                0 (a)
              6 GET_ITER
        >>    7 FOR_ITER                16 (to 26)
             10 STORE_FAST               1 (x)
             13 LOAD_FAST                1 (x)
             16 LOAD_CONST               1 (1)
             19 BINARY_ADD
             20 LIST_APPEND              2
             23 JUMP_ABSOLUTE            7
        >>   26 RETURN_VALUE

...そしてdis.dis(lambda a: tuple(x + 1 for x in a))収量...

  1           0 LOAD_GLOBAL              0 (tuple)
              3 LOAD_CONST               1 (<code object <genexpr> at 0x7f62e9eda930, file "<stdin>", line 1>)
              6 MAKE_FUNCTION            0
              9 LOAD_FAST                0 (a)
             12 GET_ITER
             13 CALL_FUNCTION            1
             16 CALL_FUNCTION            1
             19 RETURN_VALUE

...しかし、そこから多くを推測することはできないかもしれません。どちらが速いか知りたい場合は、timeitモジュールをチェックしてください。

于 2013-04-12T14:15:47.117 に答える