2012-06-21 2 views
7

:두 할당 예를 들어

a = [1,2,3] 
x = [2*i for i in a] 
y = [3*i for i in a] 

그것의 크기가 큰 경우 (가능한 경우) 하나에 지능형리스트를 결합하는 것이 더 효율적이 될 것인가? 그렇다면 어떻게해야합니까? 작동하지 않는

뭔가 같은

x,y = [2*i, 3*i for i in a] 

. list comprehension을 사용하는 것이 일반 for 루프를 사용하는 것보다 계산 상 효율적이지 않다면 나에게도 알려주십시오. 감사.

+0

후자의 목록 이해는 하나의 튜플에 할당하려고 시도한 튜플 목록을 반환하므로이 작업이 실패합니다. 이후 이것을 두 개의 개별 목록으로 병합 할 수는 있지만 더 효율적이라고 말할 수는 없습니다. –

+1

쌍 목록을 [2D 행렬 전치] (http://stackoverflow.com/q/4937491/4279)와 같이 목록 쌍으로 변환 할 수 있습니다. – jfs

+0

@ user1473483'x, y = [[2 * i for i]], [3 * i for a] –

답변

9

는 항상 사용하기 쉬운 :

import timeit 

def f1(aRange): 
    x = [2*i for i in aRange] 
    y = [3*i for i in aRange] 
    return x,y 

def f2(aRange): 
    x, y = zip(*[(2*i, 3*i) for i in aRange]) 
    return x,y 

def f3(aRange): 
    x, y = zip(*((2*i, 3*i) for i in aRange)) 
    return x,y 

def f4(aRange): 
    x = [] 
    y = [] 
    for i in aRange: 
     x.append(i*2) 
     y.append(i*3) 
    return x,y 

print "f1: %f" %timeit.Timer("f1(range(100))", "from __main__ import f1").timeit(100000) 
print "f2: %f" %timeit.Timer("f2(range(100))", "from __main__ import f2").timeit(100000) 
print "f3: %f" %timeit.Timer("f3(range(100))", "from __main__ import f3").timeit(100000) 
print "f4: %f" %timeit.Timer("f4(range(100))", "from __main__ import f4").timeit(100000) 

결과는 빠른으로 첫 번째 옵션을 가리키는 일관 것으로 보인다.

f1: 2.127573 
f2: 3.551838 
f3: 3.859768 
f4: 4.282406 
+1

이것은 매우 좋은 지적입니다. 첫 번째 옵션은 아마도 가장 명확합니다 가장 빠른 것. 이것이 선호 될 유일한 시간은'aRange'가 고갈 된 발전기 였고,이 방법을 사용하면'tee()'또는 임시 목록을 사용하지 않아도됩니다. –

12

이렇게하려면 별 연산자와 함께 the zip() builtin을 사용하고 싶습니다. zip()은 일반적으로 목록으로 바뀝니다. 이렇게 사용하면 쌍을 지어 두 목록으로 나눕니다.

>>> a = [1, 2, 3] 
>>> x, y = zip(*[(2*i, 3*i) for i in a]) 
>>> x 
(2, 4, 6) 
>>> y 
(3, 6, 9) 

실제로 이것이 더 중요한 문제가 될 것이라고 확신하지는 않습니다. 의심의 효율성에 대해 timeit 모듈을 사용하는 경우

+0

여기서 목록 이해 대신 발전기를 사용할 수 있습니다. 'x, y = zip (i가 a에있는 경우 * ((2 * i, 3 ​​* i)))'(만약 차이가 있다면) – jadkik94

+0

@ jadkik94 zip으로 모든 값을 사용하기 때문에, 당신이 말하는 것이 사실이긴하지만, 거의 차이를 만들지 않을 것입니다. –

+0

@ jadkik94 가장 느린 옵션 인 것 같습니다. 내 대답을 확인하십시오. – Trufa