2017-12-26 41 views
1

불변의 객체 (int 등)를 저장하는 튜플 객체가 있고이 튜플의 수정 된 버전을 최대한 효율적/이 일을하는 가장 좋은 방법은 무엇입니까?파이썬에서 불변 객체의 수정 된 복사본을 만드는 가장 빠른 방법

다음은 현재 가지고있는 간단한 예제입니다.

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

빠른 속도입니까? 목록 이해력이 많은 오버 헤드를 추가합니까?

+1

이것은 목록 이해가 아니며 발전기 표현입니다. 그리고'timeit'을 사용하여 얻을 수있는 여러 가지 접근 방식을 벤치마킹해야합니다. –

답변

0

함수 호출은 listcomp가 아니라 오버 헤드를 추가합니다. 그리고 이것은 튜플이 아닌 생성기를 반환합니다. 같은 것이 아닌 것을주의하십시오.

0

아이디어를 벤치 마크하거나 프로필을 작성하려면 파이썬에 내장 된 및 timeit 라이브러리를 사용해보십시오. 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'을 호출해야합니다. –