2017-12-30 21 views
0

코드 1 : 2파이썬에서 두 개의 코드를 실행하는 데 혼란이 있습니까?

%%timeit 
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
second_highest = sorted(list(set([x[1] for x in students])))[1] 
([a for a,b in sorted(students) if b == second_highest]) 

코드 :

enter image description here

%%timeit 
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
s = sorted(set([x[1] for x in students])) 
for name in sorted(x[0] for x in students if x[1] == s[1]): 
    name 
가 지금은 두 프로그램의 실행에 대한 혼란 스러워요, CODE2 방법은 중첩의 사용에도 불구하고, 코드 코드 1보다 빠르다 코드 2의 for 루프. 아래 이미지는 Jupyter 노트북에서 가져온 것으로, 100000 회 반복 코드의 평균 시간을 보여줍니다. 차이는 매우 작지만 중첩 for-loop가 단일 for 루프보다 빨리 작동 할 수 있기 때문에 혼란 스럽습니다.

I 출력을 인쇄했는데, 그래서 코드

+0

각 루프의 마지막 줄은 무엇입니까? 그것은 실제로 아무 것도하지 않습니다. differnec은 두 번째 줄의'list' 함수에 대한 여분의 호출에서 발생하는 것입니다. –

+0

출력을 인쇄 할 예정 이었으므로 마지막 줄의 코드 앞에 인쇄 할 수 있습니다. – Priyansh

답변

0

그것은 중첩 루프 아니에요의 마지막 행하기 전에 인쇄를 넣을 수 있습니다.

이 라인 여기

for name in sorted(x[0] for x in students if x[1] == s[1]): 
    name 

, 당신은 발전기를 생성하고 sorted 기능을 먼저 목록을 계산

sorted(x[0] for x in students if x[1] == s[1]) 

에 전달되는 대한 잘못된 것 같다. 그런 다음 해당 식을 계산하고 목록을 얻은 후 루프를 for 반복합니다. 따라서 두 개의 루프가 있습니다. 하나씩 다른 루프가 중첩되지 않습니다.

+0

고마워요.하지만 Andy는 여전히 Code1이 차지하는 더 큰 입력 크기 시간을 기하 급수적으로 증가시키고 Code2는 선형 적으로 증가합니다. Code2가 Code1보다 빠르고 더 나은 이유를 설명해 주시겠습니까? – Priyansh

0

이것은 두 번째 경우의 for 루프에서 sorted()으로 전달되는 생성자 때문입니다. sorted() 함수는 먼저 시퀀스의 복사본을 만들고이 복사본은 목록을 생성기에서 먼저 만들어야하기 때문에 목록에서 나열하는 것보다 생성기에서 나열하는 것이 더 느립니다. 질문 : this을 참조하십시오. 그래서 당신이 목록에 의해 발전기로 대체하면 훨씬 빨라집니다.

In [11]: %%timeit 
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
s = sorted(set([x[1] for x in students])) 
for name in sorted([x[0] for x in students if x[1] == s[1]]): 
    name 
    ....: 
The slowest run took 5.71 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 4.72 µs per loop 

In [6]: %%timeit       
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
second_highest = sorted(list(set([x[1] for x in students])))[1] 
([a for a,b in sorted(students) if b == second_highest]) 
    ...: 
The slowest run took 11.50 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 5.31 µs per loop 
관련 문제