programing

C#의 StringBuilder와 같은 Python 문자열 클래스?

testmans 2023. 6. 14. 21:44
반응형

C#의 StringBuilder와 같은 Python 문자열 클래스?

에 파썬에다같문클있습래까니가스자열은이음과?와 같은 문자열 클래스가 있습니까?StringBuilder에? C#에?

일대일 상관관계는 없습니다.정말 좋은 기사는 Python의 효율적인 문자열 연결을 참조하십시오.

Python 프로그래밍 언어로 긴 문자열을 작성하면 실행 코드가 매우 느려질 수 있습니다.이 기사에서 저는 다양한 문자열 연결 방법의 계산 성능을 조사합니다.

TLDR 가장 빠른 방법은 아래와 같습니다.매우 작고 이해하기 쉽습니다.

def method6():
  return ''.join([`num` for num in xrange(loop_count)])

컴파일러 최적화에 의존하는 것은 취약합니다.Antoine-tran이 제시한 승인된 답변과 숫자에 연결된 벤치마크는 신뢰할 수 없습니다.는 Andrew Hare에게 .repr은 모든 하지만할 때 .그것은 모든 방법을 동등하게 느리게 하지만 문자열을 구성할 때 실제 페널티를 모호하게 합니다.

사용하다join그것은 매우 빠르고 더 튼튼합니다.

$ ipython3
Python 3.5.1 (default, Mar  2 2016, 03:38:02) 
IPython 4.1.2 -- An enhanced Interactive Python.

In [1]: values = [str(num) for num in range(int(1e3))]

In [2]: %%timeit
   ...: ''.join(values)
   ...: 
100000 loops, best of 3: 7.37 µs per loop

In [3]: %%timeit
   ...: result = ''
   ...: for value in values:
   ...:     result += value
   ...: 
10000 loops, best of 3: 82.8 µs per loop

In [4]: import io

In [5]: %%timeit
   ...: writer = io.StringIO()
   ...: for value in values:
   ...:     writer.write(value)
   ...: writer.getvalue()
   ...: 
10000 loops, best of 3: 81.8 µs per loop

올리버 크로우(Andrew Hare가 제공한 링크)의 코드를 사용하여 Python 2.7.3(timeit 패키지를 사용하여)에 맞게 수정했습니다.개인용 컴퓨터인 Lenovo T61, 6GB RAM, Debian GNU/Linux 6.0.6(스퀴즈)에서 실행했습니다.

다음은 10,000회 반복에 대한 결과입니다.

방법 1: 0.0538418292999초프로세스 크기 4800kb방법 2: 0.22602891922초프로세스 크기 4960kb방법 3: 0.0605459213257초프로세스 크기 4980kb방법 4: 0.054403066351초공정 크기 5536kb방법 5: 0.0551080703735초프로세스 크기 5272kb방법 6: 0.0542731285095초프로세스 크기 5512kb

그리고 5,000,000번 반복할 경우(2번 반복은 영원히처럼 너무 느리게 실행되었기 때문에 무시됨):

방법 1: 5.88603997231초프로세스 크기 37976kb방법 3: 8.40748500824초프로세스 크기 38024kb방법 4: 7.96380496025초프로세스 크기 321968kb방법 5: 8.03666186333초프로세스 크기 71720kb방법 6: 6.68192911148초프로세스 크기 38240kb

Python 남자들이 문자열 연결을 최적화하기 위해 꽤 훌륭한 일을 한 것은 분명합니다. Hoare가 말했듯이: "조기 최적화는 모든 악의 근원입니다." :-)

Python에는 유사한 목적을 달성하는 몇 가지가 있습니다.

  • 조각으로 큰 문자열을 만드는 한 가지 일반적인 방법은 문자열 목록을 만들고 완료되면 연결하는 것입니다.이것은 자주 사용되는 파이썬 관용구입니다.
    • 형식 지정과 데이터를 통합하는 문자열을 작성하려면 형식 지정을 별도로 수행합니다.
  • 문자 수준에서 삽입 및 삭제할 경우 길이가 1인 문자열 목록을 유지합니다.(이것을 문자열로 만들려면, 당신은 전화를 겁니다.list(your_string)사용할 수도 있습니다.UserString.MutableString이를 위하여
  • (c)StringIO.StringIO파일이 필요한 경우에는 유용하지만 일반 문자열 작성에서는 그렇지 않습니다.

위의 방법 5(The Pseudo File)를 사용하면 매우 우수한 성능과 유연성을 얻을 수 있습니다.

from cStringIO import StringIO

class StringBuilder:
     _file_str = None

     def __init__(self):
         self._file_str = StringIO()

     def Append(self, str):
         self._file_str.write(str)

     def __str__(self):
         return self._file_str.getvalue()

지금 그것을 사용하고 있습니다.

sb = StringBuilder()

sb.Append("Hello\n")
sb.Append("World")

print sb

String을 시도할 수 있습니다.IO 또는 cStringIO

명시적인 아날로그는 없습니다. 문자열 연결(앞에서 말한 것처럼 최적화됨)이나 서드 파티 클래스(훨씬 더 효율적인지 의심스럽습니다.)를 사용할 것으로 예상됩니다. 파이썬의 목록은 동적 유형이므로 버퍼용으로 빠르게 작동하는 char[]가 없습니다.문자열 작성기와 같은 클래스는 많은 최적화(예: 슬라이스/서브스트링에 대해 동일한 버퍼 참조)를 허용하는 여러 언어의 문자열의 고유 기능(불변성)으로 인해 조기 최적화가 아닙니다.Stringbuilder/stringbuffer/stringstream 유사 클래스는 문자열을 연결하는 것(할당 및 가비지 수집이 여전히 필요한 많은 작은 임시 개체를 생성함)과 printf 유사 도구보다 훨씬 빠르게 작동하며, 많은 형식 호출에 상당히 소모되는 형식 패턴 오버헤드를 해석할 필요가 없습니다.

Python에서 빠른 문자열 연결 방법을 찾고 있는 경우 특별한 StringBuilder 클래스가 필요하지 않습니다.C#에서 볼 수 있는 성능 저하 없이도 간단한 연결이 작동합니다.

resultString = ""

resultString += "Append 1"
resultString += "Append 2"

성능 결과는 Antoine-tran의 답변을 참조

언급URL : https://stackoverflow.com/questions/2414667/python-string-class-like-stringbuilder-in-c

반응형