목록 이해력을 가지고 놀다가 다른 사이트에서이 작은 스 니펫을 발견했습니다.
return ''.join([`num` for num in xrange(loop_count)])
나는 `num`
비트가 그것을 깨고 있다는 것을 깨닫기 전에 몇 분 동안 함수를 복제하려고 (입력하여) 보냈다 .
그 문자로 문장을 묶는 것은 무엇을합니까? 내가 볼 수 있듯이 str (num)과 동일합니다. 하지만 시간을 정했을 때 :
return ''.join([str(num) for num in xrange(10000000)])
4.09 초가 걸립니다.
return ''.join([`num` for num in xrange(10000000)])
2.43 초가 걸립니다.
둘 다 동일한 결과를 제공하지만 하나는 훨씬 느립니다. 여기서 무슨 일이 일어나고 있습니까?
편집 : 이상하게 … repr()
보다 약간 느린 결과를 제공합니다 `num`
. 2.99 초 대 2.43 초. Python 2.6 사용 (아직 3.0을 시도하지 않았습니다).
답변
백틱은 더 이상 사용되지 않는 repr()
. 더 이상 사용하지 마십시오. 구문은 Python 3.0에서 제거되었습니다.
백틱을 사용하는 것이 repr(num)
또는 num.__repr__()
버전 2.x를 사용하는 것보다 빠릅니다 . 전역 네임 스페이스 (for repr
) 또는 개체의 네임 스페이스 (for __repr__
)에서 각각 추가 사전 조회가 필요하기 때문이라고 생각합니다 .
dis
모듈을 사용하면 내 가정이 증명됩니다.
def f1(a):
return repr(a)
def f2(a):
return a.__repr__()
def f3(a):
return `a`
분해 쇼 :
>>> import dis
>>> dis.dis(f1)
3 0 LOAD_GLOBAL 0 (repr)
3 LOAD_FAST 0 (a)
6 CALL_FUNCTION 1
9 RETURN_VALUE
>>> dis.dis(f2)
6 0 LOAD_FAST 0 (a)
3 LOAD_ATTR 0 (__repr__)
6 CALL_FUNCTION 0
9 RETURN_VALUE
>>> dis.dis(f3)
9 0 LOAD_FAST 0 (a)
3 UNARY_CONVERT
4 RETURN_VALUE
f1
에 대한 전역 조회 repr
,에 f2
대한 속성 조회가 포함 __repr__
되는 반면 백틱 연산자는 별도의 opcode에서 구현됩니다. 사전 조회 ( LOAD_GLOBAL
/ LOAD_ATTR
) 나 함수 호출 ( CALL_FUNCTION
)에 대한 오버 헤드가 없기 때문에 백틱이 더 빠릅니다.
나는 파이썬 사람들이 별도의 저수준 작업을 repr()
갖는 것은 그만한 가치가 없다고 결정했고, repr()
백틱 을 둘 다 갖는 것은 원칙을 위반한다고 생각합니다.
“하나, 바람직하게는 단 하나의 분명한 방법이 있어야합니다.”
그래서 기능은 Python 3.0에서 제거되었습니다.
답변
역 따옴표 인용은 일반적으로 유용하지 않으며 Python 3에서 사라졌습니다.
그만한 가치는 다음과 같습니다.
''.join(map(repr, xrange(10000000)))
나를 위해 backtick 버전보다 약간 빠릅니다. 그러나 이것에 대해 걱정하는 것은 아마도 조기 최적화 일 것입니다.
답변
내 생각 엔 그것이 num
방법을 정의하지 않기 __str__()
때문에 str()
두 번째 조회를해야합니다 __repr__
.
백틱은 __repr__
. 그것이 사실이라면 repr()
백틱 대신 사용 하면 동일한 결과를 얻을 수 있습니다.