답변:
일대일 상관 관계가 없습니다. 정말 좋은 기사를 보려면 Python의 효율적인 문자열 연결을 참조하십시오 .
Python 프로그래밍 언어로 긴 문자열을 작성하면 코드 실행 속도가 매우 느려질 수 있습니다. 이 기사에서는 다양한 문자열 연결 방법의 계산 성능을 조사합니다.
Oliver Crow (Andrew Hare가 제공 한 링크)의 코드를 사용하고 Python 2.7.3을 조정하기 위해 약간 수정했습니다. (timeit 패키지 사용). 개인용 컴퓨터 인 Lenovo T61, 6GB RAM, Debian GNU / Linux 6.0.6 (squeeze)에서 실행했습니다.
다음은 10,000 회 반복에 대한 결과입니다.
method1 : 0.0538418292999 초 프로세스 크기 4800kb method2 : 0.22602891922 초 프로세스 크기 4960 kb method3 : 0.0605459213257 초 프로세스 크기 4980kb method4 : 0.0544030666351 초 프로세스 크기 5536 kb method5 : 0.0551080703735 초 프로세스 크기 5272 kb method6 : 0.0542731285095 초 프로세스 크기 5512kb
5,000,000 회 반복 (영원히 너무 느리게 실행 되었기 때문에 메서드 2는 무시되었습니다) :
method1 : 5.88603997231 초 프로세스 크기 37976 kb method3 : 8.40748500824 초 프로세스 크기 38024 kb method4 : 7.96380496025 초 프로세스 크기 321968 kb method5 : 8.03666186333 초 프로세스 크기 71720 kb method6 : 6.68192911148 초 프로세스 크기 38240 kb
파이썬 사람들이 문자열 연결을 최적화하기 위해 꽤 훌륭한 일을했다는 것은 분명합니다. 그리고 Hoare가 말했듯이 : "조기 최적화는 모든 악의 근원입니다.":-)
컴파일러 최적화에 의존하는 것은 취약합니다. 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
repr
호출이 런타임을 지배하지만 실수를 개인적으로 만들 필요는 없습니다.
파이썬에는 비슷한 목적을 수행하는 몇 가지가 있습니다.
list(your_string)
합니다. UserString.MutableString
이를 위해 a 를 사용할 수도 있습니다 .(c)StringIO.StringIO
그렇지 않으면 파일을 가져 오는 것에 유용하지만 일반적인 문자열 작성에는 덜 유용합니다.위의 방법 5 (의사 파일)를 사용하면 매우 우수한 성능과 유연성을 얻을 수 있습니다.
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
StringIO 또는 cStringIO를 시도 할 수 있습니다.
명시적인 아날로그는 없습니다-문자열 연결 (이전에 말했듯이 최적화되었을 가능성이 있음) 또는 타사 클래스 (훨씬 더 효율적이라는 것은 의심 스러움)를 사용해야한다고 생각합니다. 파이썬의 목록은 동적 형식이므로 빠르게 작동하지 않습니다. 내가 가정하는 버퍼에 대한 char []). Stringbuilder와 유사한 클래스는 많은 언어 (불변성)에서 문자열의 고유 한 기능으로 인해 조기 최적화가 아닙니다. 이는 많은 최적화를 허용합니다 (예 : 슬라이스 / 하위 문자열에 대해 동일한 버퍼 참조). Stringbuilder / stringbuffer / stringstream과 같은 클래스는 문자열을 연결하는 것 (할당과 가비지 수집이 여전히 필요한 많은 작은 임시 객체를 생성)과 문자열 형식화 printf와 같은 도구보다 훨씬 빠르게 작동합니다. 많은 포맷 호출.
파이썬에서 빠른 문자열 연결 방법을 찾고 있다면 특별한 StringBuilder 클래스가 필요하지 않습니다. 간단한 연결은 C #에서 볼 수있는 성능 저하없이 잘 작동합니다.
resultString = ""
resultString += "Append 1"
resultString += "Append 2"
성능 결과는 Antoine-tran의 답변 을 참조하십시오.