[PYTHON] Python에서 문자열을 풀링합니까?
PYTHONPython에서 문자열을 풀링합니까?
파이썬에는 모든 문자열 풀이 있습니까? 그리고 거기에 (문자열) 싱글 톤이 있습니까?
보다 정확하게는 다음 코드에서 하나 또는 두 개의 문자열이 메모리에 만들어졌습니다.
a = str(num)
b = str(num)
?
해결법
-
==============================
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.일반적으로 문자열은 파이썬에서 사용되지 않지만 때로는 다음과 같이 보입니다.
일반적으로 문자열은 파이썬에서 사용되지 않지만 때로는 다음과 같이 보입니다.
>>> 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.문자열은 일반적으로 금지되어 있지 않습니다. 예제에서는 두 개의 문자열이 생성됩니다 (0에서 9 사이의 값 제외). 이를 테스트하기 위해 is 연산자를 사용하여 두 문자열이 같은 객체인지 확인할 수 있습니다.
문자열은 일반적으로 금지되어 있지 않습니다. 예제에서는 두 개의 문자열이 생성됩니다 (0에서 9 사이의 값 제외). 이를 테스트하기 위해 is 연산자를 사용하여 두 문자열이 같은 객체인지 확인할 수 있습니다.
>>> str(1056) is str(1056) False
-
==============================
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
그들의 주소를 비교하는 것은 투명하게 앞선 해결책을 얻고있다.
from https://stackoverflow.com/questions/2519580/are-strings-pooled-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 한 객체의 장고 관리 페이지에서 관련 객체의 관리 페이지로 링크를 어떻게 추가합니까? (0) | 2018.10.22 |
---|---|
[PYTHON] NumPy 배열의 요소 색인 (0) | 2018.10.22 |
[PYTHON] sqlalchemy flush () 및 삽입 된 ID를 얻으려면? (0) | 2018.10.22 |
[PYTHON] matplotlib 색상 표로 seaborn color_palette (0) | 2018.10.22 |
[PYTHON] 어떻게 numpy 배열에 열을 추가하려면 (0) | 2018.10.22 |