あなたのアイデアをベンチマークするには、dis
とtimeit
のライブラリを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
は、あなたが達成したいことをするために私の頭の上から私が考えることができる唯一の他の方法でした。他のアイデアがあれば、それらをテストし、フィードバックが必要な場合は質問を編集してください。
これはリストの理解ではなく、ジェネレータの表現です。そして、あなたは 'timeit'を使って思いつくことができるさまざまなアプローチをベンチマークするべきです。 –