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


87

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

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을 시도하지 않았습니다).


8
skymind.com/~ocrow/python_string 에서 "다른 사이트"를 읽은 후 비슷한 질문이 있었고이 페이지를 찾았습니다. 좋은 질문과 좋은 답변 :)
netvope

답변:


122

백틱은 더 이상 사용되지 않는 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에서 제거되었습니다.


백틱을 일부 함수 호출로 대체하는 방법을 찾고 싶었지만 불가능한 것 같습니까?
Jiri

2
백틱 대신 repr ()을 사용하십시오. 백틱은 repr () come 3.0에 대한 감가 상각 된 구문입니다. 실제로 ANOTHER 함수를 호출하는 것보다 백틱 모양을 선호합니다.
Dominic Bou-Samra

8
백틱이 사용되지 않는 이유도`문자 자체 때문입니다. 타이핑하기 (일부 키보드에서는), 그것이 무엇인지보기가 어렵고, 파이썬 책에서 올바르게 인쇄하기가 어려울 수 있습니다. 기타
u0b34a0f6ae

4
@ kaizer.se : 지적 해 주셔서 감사합니다. 이것이 아마도 백틱을 삭제하는 주된 이유 일 것입니다. 메일 링리스트 아카이브의 Guidos 문을 참조하십시오 : mail.python.org/pipermail/python-ideas/2007-January/000054.html
Ferdinand Beyer

이것이 게시 된 원래 질문은 실제로 키보드에서 백틱을 찾을 수 없기 때문입니다.
Dominic Bou-Samra

10

역 따옴표 인용은 일반적으로 유용하지 않으며 Python 3에서 사라졌습니다.

그만한 가치는 다음과 같습니다.

''.join(map(repr, xrange(10000000)))

나를 위해 backtick 버전보다 약간 빠릅니다. 그러나 이것에 대해 걱정하는 것은 아마도 조기 최적화 일 것입니다.


2
왜 뒤로 물러나서 목록 / 반복자 이해 대신 맵을 사용합니까?
nikow

4
실제로 timeitfor ''.join(map(repr, xrange(0, 1000000)))보다 더 빠른 결과를 제공합니다 ''.join([repr(i) for i in xrange(0, 1000000)])(에서는 더 나쁨 ''.join( (repr(i) for i in xrange(0, 1000000)) )). 약간 실망 스럽습니다 ;-)
RedGlyph 2009

8
bobince의 결과는 놀랍지 않습니다. 경험상 파이썬의 암시 적 루프는 명시 적 루프보다 빠르며 종종 극적으로 빠릅니다. map가상 머신에서 실행되는 Python 루프보다 훨씬 빠른 C 루프를 사용하여 C로 구현됩니다.
Ferdinand Beyer

7
놀랍지는 않지만 목록 이해력의 평판에 너무 나쁩니다 (이 예에서는 30 %의 히트를 기록함). 그러나 이것이 정말로 중요하지 않다면 엄청나게 빠른 코드보다 분명한 것이 낫습니다. 그래서 여기서 큰 문제는 아닙니다. 즉, map () 함수가 불분명하다고 생각하지 않으며 LC는 때때로 과대 평가됩니다.
RedGlyph 2009

4
map나에게는 완벽하게 명확하고 간결한 것처럼 보이며 Python도 모릅니다.
Zenexer 2013-09-08

1

내 생각 엔 그것이 num방법을 정의하지 않기 __str__()때문에 str()두 번째 조회를해야합니다 __repr__.

백틱은 __repr__. 그것이 사실이라면 repr()백틱 대신 사용 하면 동일한 결과를 얻을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.