2014-06-10 2 views
-2

제목을 쓰는 것이 어렵습니다.효율성 : EmptyList의 x와 길이가> 0 인 경우

잠재적으로 비어있는 목록을 반복하고 싶다면 더욱 효율적입니다. 나는 그 목록이 대다수의 시간 동안 비어있을 것으로 기대하고있다. 파이썬의리스트의 루프 검사 길이 어쨌든이 추가 명시 적으로 확인 CPU 사이클 만 낭비하기 때문에

for x in list: 
    dostuff() 

또는

if len(list)>0: 
    for x in list: 
     dostuff() 
+5

화내는하지만, 이런 종류의 질문은 적어도 생산 중 하나입니다 사람이 물을 가능성이있는 것들. 성능 차이가 실제로 중요하지 않을 수있을뿐만 아니라 질문하거나 추측하는 대신 ** 벤치마킹 **을 통해이 문제를 해결해야하는 경우가 거의 없습니다. C 코드를보고 관련 하드웨어 및 소프트웨어 전체 스택을 파악할 때 성능에 대한 추론 *이 잘 작동하지 않습니다. 파이썬 코드를보고 하드웨어와 파이썬 구현에 대해 많이 알지 못하는 경우에는 더 악화됩니다. – delnan

답변

2

는 :

>>> from timeit import timeit 
>>> timeit('for x in lst:pass', 'lst=[]') 
0.08301091194152832 
>>> timeit('if len(lst)>0:\n for x in lst:\n pass', 'lst=[]') 
0.09223318099975586 

그냥 목록이 비어있을 때 목록과 상관없이 국가의보다 빠르고 옵션 만들기, 빨리 될 것 for 루프를하고있는 것 같습니다. if lst 목록의 길이를 확인하거나 항상 for 루프를 수행하거나보다 훨씬 빠른 사용

>>> timeit('if lst:\n for x in lst:\n pass', 'lst=[]') 
0.03235578536987305 

:

하지만, 훨씬 더 빠른 옵션이 있습니다. 그러나 세 가지 방법 모두 매우 빠릅니다. 따라서 코드를 최적화하려는 경우 실제 병목 현상이 무엇인지 찾으려고 시도하는 것이 좋습니다. When is optimisation premature?을 살펴보십시오.

+0

굉장합니다. 감사! – user3727843

0

첫 번째 변종이 더 효율적입니다. 목록이 비어있는 경우

+3

대화가 저렴합니다. 벤치마킹은 어디에 있습니다! (또한 루프를 설정하고 목록 메서드를 실행하는 것이 Python 수준의 길이 검사보다 오래 걸릴 가능성을 무시합니다.) – delnan

+0

timeit에 따르면 전혀 차이가 없습니다. 즉, 때로는 더 빠르거나 때로는 느려질 수 있습니다 . 첫 번째는 0.003286123275756836이고 두 번째는 0.000086 루프에 대해 0.0032868385314941406입니다. – CubiX

1

당신은 그렇게 할 필요가 len(list)을 확인하지 않으려면 if listFalse로 평가됩니다 if list:

In [15]: if l: 
    ....:  print "hello" 
    ....:  

In [16]: l1= [1] 

In [17]: if l1: 
    ....:  print "hello from l1" 
    ....:  
hello from l1 

In [21]: %timeit for x in l:pass 
10000000 loops, best of 3: 54.4 ns per loop 

In [22]: %timeit if l:pass 
10000000 loops, best of 3: 22.4 ns per loop 

를 사용할 수 있습니다. timeit 모듈에서 타이밍을 바탕으로

+0

질문에 대한 답변이 –

+0

@TimCastelijns 인 것 같지 않습니다. 목록이 정상적으로 비어있는 경우 'if list'가 더 빠를 것입니다. –

1

첫 번째로 if len(list) > 0:은 가독성을 높이기 위해 if list:이어야합니다. 나는 개인적으로 if 진술이 중복되어 있다고 생각했을 테지만 timeit은 나를 잘못 증명하는 것처럼 보입니다. (빈 목록) 하늘의 목록에 대한 체크를 갖는 코드를 빨리 만드는 것을 (나는 바보 같은 실수를하지하지 않는 한) 것 같습니다 :

$ python -m timeit 'list = []' 'for x in list:' ' print x' 
10000000 loops, best of 3: 0.157 usec per loop 

$ python -m timeit 'list = []' 'if list:' ' for x in list:' '  print x' 
10000000 loops, best of 3: 0.0766 usec per loop 
관련 문제