복붙노트

[PYTHON] Python에서 문자열을 풀링합니까?

PYTHON

Python에서 문자열을 풀링합니까?

파이썬에는 모든 문자열 풀이 있습니까? 그리고 거기에 (문자열) 싱글 톤이 있습니까?

보다 정확하게는 다음 코드에서 하나 또는 두 개의 문자열이 메모리에 만들어졌습니다.

a = str(num)
b = str(num) 

?

해결법

  1. ==============================

    1.문자열은 파이썬에서 불변합니다. 따라서 구현은 인턴 (일부 문자열이 풀에 저장되는 것을 의미하는 C #과 종종 관련된 용어 임) 문자열 여부를 결정할 수 있습니다.

    문자열은 파이썬에서 불변합니다. 따라서 구현은 인턴 (일부 문자열이 풀에 저장되는 것을 의미하는 C #과 종종 관련된 용어 임) 문자열 여부를 결정할 수 있습니다.

    귀하의 예에서는 동적으로 문자열을 생성합니다. CPython은 문자열이 이미 있는지 여부를 감지하기 위해 항상 풀을 조사하지 않습니다. 문자열을 작성하기 위해 메모리를 예약해야하기 때문에 이해가되지 않습니다. 그리고 풀 내용과 비교합니다 (비효율적입니다. 문자열).

    그러나 길이가 1 인 문자열의 경우 CPython은 풀을 조사합니다 (cf. "stringobject.c"참조).

    static PyStringObject *characters[UCHAR_MAX + 1];
    
    ...
    
    PyObject *
    PyString_FromStringAndSize(const char *str, Py_ssize_t size)
    {
    
    ...
    
        if (size == 1 && str != NULL &&
        (op = characters[*str & UCHAR_MAX]) != NULL)
        {
            #ifdef COUNT_ALLOCS
                one_strings++;
            #endif
    
            Py_INCREF(op);
            return (PyObject *)op;
        }
    
    ...
    

    그래서:

    a = str(num)
    b = str(num)
    print a is b # <-- this will print False in most cases (but try str(1) is str(1))
    

    그러나 코드에서 상수 문자열을 직접 사용할 때 CPython은 동일한 문자열 인스턴스를 사용합니다.

    a = "text"
    b = "text"
    print a is b # <-- this will print True
    
  2. ==============================

    2.일반적으로 문자열은 파이썬에서 사용되지 않지만 때로는 다음과 같이 보입니다.

    일반적으로 문자열은 파이썬에서 사용되지 않지만 때로는 다음과 같이 보입니다.

    >>> str(5) is str(5)
    True
    >>> str(50) is str(50)
    False
    

    일반적인 객체가 비정상적인 객체가 아닌 방식으로 최적화 될 수있는 Python에서는 드문 일이 아닙니다.

    >>> int(5+0) is int(5+0)
    True
    >>> int(50+0) is int(50+0)
    True
    >>> int(500+0) is int(500+0)
    False
    

    그리고 이러한 모든 종류의 세부 사항은 파이썬의 구현과 심지어 같은 구현의 버전 사이에서도 다를 것입니다.

  3. ==============================

    3.문자열은 일반적으로 금지되어 있지 않습니다. 예제에서는 두 개의 문자열이 생성됩니다 (0에서 9 사이의 값 제외). 이를 테스트하기 위해 is 연산자를 사용하여 두 문자열이 같은 객체인지 확인할 수 있습니다.

    문자열은 일반적으로 금지되어 있지 않습니다. 예제에서는 두 개의 문자열이 생성됩니다 (0에서 9 사이의 값 제외). 이를 테스트하기 위해 is 연산자를 사용하여 두 문자열이 같은 객체인지 확인할 수 있습니다.

    >>> str(1056) is str(1056)
    False
    
  4. ==============================

    4.파이썬에서 풀의 상수는 작은 정수 풀과 큰 정수 풀을 구별하며 작은 정수 풀은 [-5, 257]의 범위입니다. 및 대형 정수 풀의 다른 정수 Cython에서이 데이터를 저장할 링크드 목록을 정의하면 데이터를 가져 오는 것이 매우 편리하고 빠르게됩니다.

    파이썬에서 풀의 상수는 작은 정수 풀과 큰 정수 풀을 구별하며 작은 정수 풀은 [-5, 257]의 범위입니다. 및 대형 정수 풀의 다른 정수 Cython에서이 데이터를 저장할 링크드 목록을 정의하면 데이터를 가져 오는 것이 매우 편리하고 빠르게됩니다.

    # ifndef NSMALLPOSINTS
        # define NSMALLPOSINTS 257
    # endif
    
    # ifndef NSMALLNEGINTS
        # define NSMALLNEGINTS 5
    # endif
    
    # if NSMALLPOSINTS + NSMALLNEGINTS > 0
        static PyIntObject * small_ints[NSMALLPOSINTS + NSMALLNEGINTS];
    # endif
    

    BTW : 정수 257 어쩌면 낯선 사람; 동일한 값을 가진 두 객체가 동일한 필드에 있으면 해당 객체의 주소가 동일하거나 다를 수 있으며 프로세스의 컨텍스트에 따라 달라질 수 있습니다. 반면에 다른 필드에 있다면 주소가 달라야합니다.

    그런데 문자열 유형에 따라 cython은 문자열의 길이가 1이어야하는 상수 풀을 제공하지만 반면에 동일한 객체는 아니어도됩니다

    a = str(11)
    b = str(11)
    print a == b      # True 
    print a is b      # False
    
    c = str("A")
    d = str("A")   
    print c == d    # True
    print c is d    # True
    
    aa = 12
    bb = 12
    print aa == bb    # True
    print aa is bb    # True
    
    cc = 333
    dd = 333
    print cc == dd    # True
    print cc is dd    # False
    

    그들의 주소를 비교하는 것은 투명하게 앞선 해결책을 얻고있다.

  5. from https://stackoverflow.com/questions/2519580/are-strings-pooled-in-python by cc-by-sa and MIT license