[python] 백틱이 파이썬 인터프리터에게 의미하는 바 :`num`

목록 이해력을 가지고 놀다가 다른 사이트에서이 작은 스 니펫을 발견했습니다.

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()백틱 대신 사용 하면 동일한 결과를 얻을 수 있습니다.


답변