2017-12-26 14 views
1

不変なオブジェクト(intなど)を格納するタプルオブジェクトを持っていて、このタプルの修正バージョンをできるだけ効率的にまたは高速に作成する必要がある場合、これを行う最善の方法は何ですか?Pythonで不変オブジェクトの修正されたコピーを作る最速の方法

ここに私が現在持っているものの単純化された例があります。

orig_tuple = (1, 0, 0) 
new_tuple = (some_function(element) for element in orig_tuple) 

これは速いですか?リストの理解度にはオーバーヘッドがかかりますか?

+1

これはリストの理解ではなく、ジェネレータの表現です。そして、あなたは 'timeit'を使って思いつくことができるさまざまなアプローチをベンチマークするべきです。 –

答えて

0

関数呼び出しは、listcompではなくオーバーヘッドを追加するものです。これは、タプルではなく、ジェネレータを返します。同じではないことに注意してください。

0

あなたのアイデアをベンチマークするには、distimeitのライブラリをPythonに組み込んでみてください。私はWindows 7 x64でPython 2.7を使用しています。プロデュース

import copy 
import dis 
import timeit 

def method_one(): 
    def add_one(i): 
     return i+1 

    orig_tuple = (1, 0, 0) 
    new_tuple = (add_one(element) for element in orig_tuple) 

def method_two(): 
    def add_one(i): 
     return i+1 

    orig_tuple = (1, 0, 0) 
    new_tuple = copy.deepcopy(orig_tuple) 
    for i in new_tuple: 
     i = add_one(i) 

print dis.dis(method_one) 
print timeit.timeit(method_one, number=10000) 

print dis.dis(method_two) 
print timeit.timeit(method_two, number=10000) 

:あなたが見ることができるように

D:\Users\user>python help.py 
    6   0 LOAD_CONST    1 (<code object add_one at 01DA6B60, file "help.py", line 6 
>) 
       3 MAKE_FUNCTION   0 
       6 STORE_DEREF    0 (add_one) 

    9   9 LOAD_CONST    5 ((1, 0, 0)) 
      12 STORE_FAST    0 (orig_tuple) 

10   15 LOAD_CLOSURE    0 (add_one) 
      18 BUILD_TUPLE    1 
      21 LOAD_CONST    4 (<code object <genexpr> at 01DA6CC8, file "help.py", line 
10>) 
      24 MAKE_CLOSURE    0 
      27 LOAD_FAST    0 (orig_tuple) 
      30 GET_ITER 
      31 CALL_FUNCTION   1 
      34 STORE_FAST    1 (new_tuple) 
      37 LOAD_CONST    0 (None) 
      40 RETURN_VALUE 
None 
0.0088386 
13   0 LOAD_CONST    1 (<code object add_one at 020C6F50, file "help.py", line 1 
3>) 
       3 MAKE_FUNCTION   0 
       6 STORE_FAST    0 (add_one) 

16   9 LOAD_CONST    4 ((1, 0, 0)) 
      12 STORE_FAST    1 (orig_tuple) 

17   15 LOAD_GLOBAL    0 (copy) 
      18 LOAD_ATTR    1 (deepcopy) 
      21 LOAD_FAST    1 (orig_tuple) 
      24 CALL_FUNCTION   1 
      27 STORE_FAST    2 (new_tuple) 

18   30 SETUP_LOOP    26 (to 59) 
      33 LOAD_FAST    2 (new_tuple) 
      36 GET_ITER 
     >> 37 FOR_ITER    18 (to 58) 
      40 STORE_FAST    3 (i) 

19   43 LOAD_FAST    0 (add_one) 
      46 LOAD_FAST    3 (i) 
      49 CALL_FUNCTION   1 
      52 STORE_FAST    3 (i) 
      55 JUMP_ABSOLUTE   37 
     >> 58 POP_BLOCK 
     >> 59 LOAD_CONST    0 (None) 
      62 RETURN_VALUE 
None 
0.1026118 

は、それははるかに高速である発電機を作るように見えます。 method_twoは、あなたが達成したいことをするために私の頭の上から私が考えることができる唯一の他の方法でした。他のアイデアがあれば、それらをテストし、フィードバックが必要な場合は質問を編集してください。

+0

ジェネレータを作成するだけでは同じではありません。たとえば、インデックスに登録することはできません。明示的に 'tuple'を呼び出す必要があります。 –

関連する問題