Python\의 문자열 연결 최적화가 큰 문자열에 적용됩니까?

DDD
풀어 주다: 2024-11-03 07:51:29
원래의
241명이 탐색했습니다.

Does Python's string concatenation optimization apply to large strings?

Python에서 한 문자열을 다른 문자열에 효율적으로 추가하는 방법

Python에서는 문자열을 ' ' 연산자로 연결하는 것이 일반적인 작업입니다. 다음 코드는 간단하지만

<code class="python">var1 = "foo"
var2 = "bar"
var3 = var1 + var2</code>
로그인 후 복사

특히 큰 문자열이나 반복되는 연결의 경우 효율성에 대한 의문을 제기합니다.

In-Place String Extension

다행히 CPython은 문자열 연결 효율성을 높이기 위한 최적화를 구현했습니다. 문자열에 대한 단일 참조만 존재하고 여기에 다른 문자열이 추가되면 CPython은 원래 문자열을 제자리에서 확장하려고 시도합니다. 이 최적화를 통해 연산은 O(n)으로 상각됩니다.

예를 들어 다음 코드는 O(n^2)였습니다.

<code class="python">s = ""
for i in range(n):
    s += str(i)</code>
로그인 후 복사

그러나 최적화를 통해 이제는 O(n)에서 실행됩니다.

Python 구현 세부 정보

다음은 최적화를 보여주는 Python C 소스 코드에서 발췌한 것입니다.

<code class="c">int
_PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
{
    /* ... */
    *pv = (PyObject *)
        PyObject_REALLOC((char *)v, PyBytesObject_SIZE + newsize);
    if (*pv == NULL) {
        PyObject_Del(v);
        PyErr_NoMemory();
        return -1;
    }
    _Py_NewReference(*pv);
    sv = (PyBytesObject *) *pv;
    Py_SIZE(sv) = newsize;
    sv->ob_sval[newsize] = '<pre class="brush:php;toolbar:false"><code class="python">import timeit

s = ""
for i in range(10):
    s += 'a'

# Time the concatenation of 10 'a' characters
t1 = timeit.timeit(stmt="""s = ""
for i in range(10):
    s += 'a'""", globals=globals(), number=1000000)

# Time the concatenation of 100 'a' characters
t2 = timeit.timeit(stmt="""s = ""
for i in range(100):
    s += 'a'""", globals=globals(), number=100000)

# Time the concatenation of 1000 'a' characters
t3 = timeit.timeit(stmt="""s = ""
for i in range(1000):
    s += 'a'""", globals=globals(), number=10000)

print("10 'a':", t1)
print("100 'a':", t2)
print("1000 'a':", t3)</code>
로그인 후 복사
'; sv->ob_shash = -1; /* invalidate cached hash value */ return 0; }

이 함수를 사용하면 문자열 개체의 크기를 조정할 수 있지만 해당 개체에 대한 참조가 하나만 있는 경우에만 가능합니다. 원래 메모리 위치를 유지하면서 문자열의 크기가 변경됩니다.

주의

이 최적화는 Python 사양의 일부가 아니라는 점에 유의하는 것이 중요합니다. CPython 인터프리터에서만 구현됩니다. PyPy 또는 Jython과 같은 다른 Python 구현은 다른 성능 특성을 나타낼 수 있습니다.

실증적 테스트

경험적으로 최적화는 다음 코드의 성능에서 분명하게 나타납니다.

결과는 연결 수가 증가함에 따라 실행 시간이 크게 증가하는 것으로 나타나 더 큰 문자열에는 최적화가 적용되지 않음을 나타냅니다.

결론

Python의 내부 문자열 확장 최적화는 특정 시나리오에서 문자열 연결 효율성을 극적으로 향상시키지만, 이 구현의 한계를 이해하는 것이 중요합니다. 큰 문자열의 경우 또는 메모리 관리 고려 사항이 가장 중요한 경우 최적의 성능을 달성하기 위해 문자열 조작의 대체 방법이 필요할 수 있습니다.

위 내용은 Python\의 문자열 연결 최적화가 큰 문자열에 적용됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿