programing

파이썬의 str 성능

showcode 2023. 5. 20. 11:01
반응형

파이썬의 str 성능

파이썬 코드 일부를 프로파일링하는 동안(python 2.6까지3.2), 저는 그것을 발견했습니다.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

반응형