필자는 외부 종속성이없는 pure-python을 두 시퀀스의 요소별로 비교하려고했습니다. 내 최초의 솔루션이었다 : 지도 대 Starmap의 성능?
list(map(operator.eq, seq1, seq2))
은 그 때 나는 나에게 꽤 비슷한 것 같았다,
itertools
에서
starmap
기능을 발견했다. 그러나 최악의 경우 컴퓨터에서 37 % 빨랐습니다. 그것이 나에게 분명하지 않았다, 나는이 발전기에서 한 요소를 검색하는 데 필요한 시간을 측정 (이 방법이 정확한지 모르겠다) : 요소를 두 번째 솔루션을 검색에서
from operator import eq
from itertools import starmap
seq1 = [1,2,3]*10000
seq2 = [1,2,3]*10000
seq2[-1] = 5
gen1 = map(eq, seq1, seq2))
gen2 = starmap(eq, zip(seq1, seq2))
%timeit -n1000 -r10 next(gen1)
%timeit -n1000 -r10 next(gen2)
271 ns ± 1.26 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
208 ns ± 1.72 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
이 24 % 더 성능이 좋은이다 . 그 후에 그들은 모두 list
에 대해 동일한 결과를 산출합니다. 그러나 어딘가에서 우리는 시간에 추가로 13 %를 얻을 :
%timeit list(map(eq, seq1, seq2))
%timeit list(starmap(eq, zip(seq1, seq2)))
5.24 ms ± 29.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3.34 ms ± 84.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
나는 그런 중첩 된 코드의 프로파일에 깊이 파고하는 방법을 몰라? 그래서 제 질문은 왜 우리가 list
함수에서 13 %의 추가 이득을 얻을 수 있는지 검색하는 첫 번째 생성기가 그렇게 빠른 이유입니까?
EDIT : all
list
함수로 대체 나의 제 의도 대신 all
의 요소 와이즈 비교를 수행 하였다. 이 대체는 타이밍 비율에 영향을주지 않습니다. 윈도우 10 (64 비트)에
CPython의 3.6.2 내가 알 수
왜 그냥 사용하지 ... 호출 된 함수는 C 함수 때
zip
와starmap
여러 인수map
를 호출하는 것보다 빠르다는 것을 점에 이르기까지의 "우연"의 많은있다'seq1 = = seq2'? –@ Błotosmętek 정정에 감사드립니다! 나의 첫 번째 의도는'all' 대신에 element-wise 비교였다. 나의 질문에서 분명하지 않았다. 정말로'all' 대신'list'를 사용하면 시간 순서가 동일해질 것이다. – godaygo
파이썬 버전은 무엇입니까? 그리고이 CPython은 무엇입니까? – MSeifert