IT

훌륭한에서의 str 성능

lottoking 2020. 9. 12. 10:27
반응형

훌륭한에서의 str 성능


코드의 조각을 약력 링하는 동안 ( python 2.6최대 3.2), I는 것을 발견 str합니다.로 (내 경우 정수에) 메서드는 개체를 변환하는 것은 느린 서식을 사용하는 것보다 크기의 거의 순서입니다.

다음은 벤치 마크입니다.

>>> from timeit import Timer
>>> Timer('str(100000)').timeit()
0.3145311339386332
>>> Timer('"%s"%100000').timeit()
0.03803517023435887

왜 이것이 사실인지 아는 사람이 있습니까? 내가 뭔가를 놓치고 있습니까?


'%s' % 100000 컴파일러에 의해 평가 실행시 상수와 동일합니다.

>>> import dis
>>> dis.dis(lambda: str(100000))
  8           0 LOAD_GLOBAL              0 (str)
              3 LOAD_CONST               1 (100000)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        
>>> dis.dis(lambda: '%s' % 100000)
  9           0 LOAD_CONST               3 ('100000')
              3 RETURN_VALUE        

%표현식은 런타임 str다음 보다 (상당히) 빠르지 않습니다 .

>>> Timer('str(x)', 'x=100').timeit()
0.25641703605651855
>>> Timer('"%s" % x', 'x=100').timeit()
0.2169809341430664

str@DietrichEpp가 말했듯이 여전히 약간 느리다는 점에 유의하십시오. 이는 str조회 및 함수 호출 작업이 포함되고 %단일 한 바이트 코드로 되기 때문입니다 .

>>> dis.dis(lambda x: str(x))
  9           0 LOAD_GLOBAL              0 (str)
              3 LOAD_FAST                0 (x)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        
>>> dis.dis(lambda x: '%s' % x)
 10           0 LOAD_CONST               1 ('%s')
              3 LOAD_FAST                0 (x)
              6 BINARY_MODULO       
              7 RETURN_VALUE        

물론 위의 내용은 내가 테스트 한 시스템 (CPython 2.7)에 해당됩니다. 다른 구현은 다를 수 있습니다.


한 가지 이유 떠오르는 str(100000)는 글로벌 조회 포함하지만 "%s"%100000오는가 않은 사실입니다 . str글로벌은 글로벌 범위에서해야한다. 이것은 전체 차이를 설명하지 않습니다.

>>> Timer('str(100000)').timeit()
0.2941889762878418
>>> Timer('x(100000)', 'x=str').timeit()
0.24904918670654297

thg435 에서 언급 한 바와 ,

>>> Timer('"%s"%100000',).timeit()
0.034214019775390625
>>> Timer('"%s"%x','x=100000').timeit()
0.2940788269042969

참고 URL : https://stackoverflow.com/questions/10530315/str-performance-in-python

반응형