__pypy__ 모듈¶
__pypy__모듈은 PyPy의 표준 인터프리터가 제공하는 특수 기능들의 주요 진입점입니다. 이 모듈의 내용은 configuration options에 따라 달라지는데, 이 옵션들은 새로운 기능과 함수를 추가할 수 있으며 그 함수의 존재 여부가 해당 기능의 존재를 나타냅니다. 이는 일반적으로 CPython에서는 C로 작성되는 순수 파이썬 모듈을 작성할 때 호환성을 위해 사용됩니다. CPython에서는 사용할 수 없으므로, if platform.python_implementation == 'PyPy'블록 안에서 사용하거나 CPython 인터프리터로부터 숨겨야 합니다.
일반적으로 사용 가능한 기능¶
internal_repr(obj): 객체의 인터프리터 수준 표현을 반환합니다.
bytebuffer(length): 주어진 길이의 새 읽기-쓰기 버퍼를 반환합니다. 이는 문자의 단순화된 배열처럼 동작합니다(실제로는 설정에 따라array모듈이 내부적으로 이를 사용합니다).
attach_gdb(): 인터프리터 수준에서 GDB를 시작합니다(변환 이전이라면 PDB를 시작합니다).
newmemoryview(buffer, itemsize, format, shape=None, strides=None):buffer의 데이터와 지정된 itemsize, format, 그리고 선택적인 shape 및 strides를 사용하여 memoryview 인스턴스를 생성합니다.
bufferable: 서브클래스가 오버라이드할 수 있도록__buffer__(self, flags)메서드를 제공하는 베이스 클래스입니다. 이 메서드는 클래스 인스턴스의 memoryview 인스턴스를 반환해야 합니다. C-API의tp_as_buffer. bf_getbuffer에 의해 호출됩니다.
builtinify(func): CPython에서는 C로 구현되어 있는 것들을 앱 레벨 모듈에서 구현하기 위한 것으로, 이 데코레이터는 함수가 절대 메서드처럼 바인딩되지 않도록 보호합니다. 일부 테스트에서 클래스에 “빌트인” 함수를 넣고 인스턴스를 통해 접근하는 것과 같은 작업을 수행하기 때문에 유용합니다.
hidden_applevel(func): 앱 레벨에서 함수의 프레임을 숨기는 데코레이터입니다.
get_hidden_tb(): applevel에서 숨겨진 프레임이 처리 중인 현재 예외의 트레이스백을 반환합니다.
lookup_special(obj, meth): 객체에서 특수 메서드를 조회합니다.
do_what_I_mean
resizelist_hint(sizehint)는 인자 리스트의 하부 저장소를 sizehint 크기로 재할당합니다.
newlist_hint(...): 길이가 sizehint인 내부 저장소를 갖는 새 빈 리스트를 생성합니다
add_memory_pressure(bytes): 추정 바이트 수만큼 메모리 압력을 추가합니다. 내부적으로 큰 메모리 덩어리를 할당하는 C 함수를 호출할 때 유용합니다. 이는 GC가 그렇지 않았을 경우보다 더 빨리 가비지 컬렉션을 수행하도록 지시합니다.
newdict(type): 특별한 구현 전략을 사용해 일반 dict를 생성합니다.type은 문자열이며 다음 중 하나일 수 있습니다:
"module"는some_module.__dict__와 동등합니다"instance"- 키 집합이 별로 변하지 않는 인스턴스 딕셔너리와 동등합니다"kwargs"- 함수에서**kwargs로 얻는 것과 동등한 키워드 인자 딕셔너리로, 전달에 최적화되어 있습니다."strdict"- 문자열 키 전용 딕셔너리입니다. 이는 자동으로 선택되어야 합니다.
reversed_dict: 딕셔너리 객체의 키를 역순으로 열거합니다. 이것은 CPython 호환성을 위해 단순히 reversed()를 호출하는 대신__pypy__함수로 구현되어 있습니다: PyPy에서는 딕셔너리가 순서를 가지지만 CPython 2.7에서는 그렇지 않습니다. 순서가 중요한 경우에는 collections.OrderedDict 클래스를 사용해야 합니다. 그 클래스는 __pypy__.reversed_dict()를 호출하여__reversed__를 구현합니다.
dict_popitem_first:OrderedDict.popitem(last=False)의 인터프리터 레벨 구현입니다.
delitem_if_value_is는 다음과 동등한 원자적 연산입니다:if dict.get(key) is value: del dict[key].특수 용도로만 사용하십시오! 예를 들어 키가
int나str인 경우처럼 특수화된 딕셔너리에는 사용을 피하십시오. 객체 전략으로 전환되기 때문입니다. 또한is연산은 실제로 포인터 동등성 비교이므로,value가int나str같은 불변 객체인 경우에는 사용을 피하십시오.
move_to_end: 딕셔너리 객체의 키를 첫 번째 또는 마지막 위치로 이동시킵니다. 이는 Python 3.x에서OrderedDict.move_to_end()를 구현하는 데 사용됩니다.
strategy(dict or list or set): 객체가 현재 사용 중인 기반 전략을 반환합니다.
list_get_physical_size(obj): 하위 리스트의 물리적 크기(즉, 초과 할당된 크기)를 반환합니다
specialized_zip_2_lists
locals_to_fast
set_code_callback
save_module_content_for_future_reload
decode_long
side_effects_ok: 역디버거(reverse-debugger)와 함께 사용하기 위한 것으로, 이 함수는 일반적으로 True를 반환하지만, watchpoint와 같은 디버깅 명령을 평가 중이면 False를 반환합니다. watchpoint를 평가할 때는 (캐싱을 포함해) 어떠한 부작용도 일으키지 않아야 할 책임이 있습니다. 이 함수는 약간의 도움을 주기 위한 것입니다—다음과 같이 작성할 수 있습니다:if not __pypy__.side_effects_ok(): skip the caching logicgetter 메서드나 프로퍼티 내부에서, 이를 watchpoint에서 사용할 수 있도록 만들기 위해. Python 코드를 변경한 후에는
REVDB=.. pypy를 다시 실행해야 한다는 점에 유의하십시오.
stack_almost_full: 스택이 15/16 이상 찼으면 True를 반환합니다.
pyos_inputhook: CPython C API에서 PyOS_InputHook()를 호출합니다
get_console_cp(): (Windows 전용) 콘솔 코드 페이지와 콘솔 출력 코드 페이지를 반환합니다.GetConsoleCP와GetConsoleOuputCP를 호출하는 것과 동일합니다.
utf8content(u): 유니코드 문자열 u가 주어지면, 그 내부 바이트 표현을 반환합니다. 디버깅에만 유용합니다.
os.real_getenv(...)는 파이썬 코드를 건너뛰고 OS 환경 변수를 가져옵니다.
_pypydatetime는 순수 파이썬datetime표준 라이브러리 모듈을 위해 올바른 C API 상호작용을 갖춘 기반 클래스를 제공합니다
빠른 문자열 연결(Concatenation)¶
제자리 연결(+=) 대신, 빠르고 복사를 최소화하는 문자열 구성을 위해 이들을 사용하십시오.
builders.StringBuilderbuilders.UnicodeBuilder
PyPy 디버그 로그와 상호작용하기¶
다음 함수들은 PYPYLOG에 사용자 정의 내용을 작성하는 데 사용할 수 있습니다.
debug_start(category, timestamp=False): 새 섹션을 엽니다.timestamp가True이면, 로그에 기록된 타임스탬프도 반환합니다.debug_stop(category, timestamp=False):debug_start로 연 섹션을 닫습니다.debug_print(...): 임의의 텍스트를 로그에 출력합니다.debug_print_once(category, ...):debug_start+debug_print+debug_stop와 동등합니다.debug_flush: 로그를 플러시(flush)합니다.debug_read_timestamp(): 로그에서 사용하는 것과 동일한 타이머로부터 타임스탬프를 읽습니다.debug_get_timestamp_unit():debug_read_timestamp()가 반환하는 값의 단위를 가져옵니다.
아키텍처와 운영체제에 따라 PyPy는 타임스탬프를 읽는 방식이 다르므로, 로그 파일에서 사용되는 타임스탬프는 서로 다른 단위로 표현됩니다. debug_get_timestamp_unit()을 호출하여 어떤 단위인지 알 수 있으며, 다음 값 중 하나가 됩니다:
tscx86머신에서의 기본값입니다: 타임스탬프는 Time Stamp Counter가 읽어들인 CPU 틱으로 표현됩니다.ns- 타임스탬프는 나노초 단위로 표현됩니다.
QueryPerformanceCounter- Windows에서는 어떤 이유로
tsc를 사용할 수 없는 경우, 타임스탬프는 win APIQueryPerformanceCounter()를 사용하여 읽습니다.
아쉽게도 tsc 틱(tick)을 나노초로 변환하는 신뢰할 만한 표준 방법은 없는 것 같습니다만, 실제로는 최신 CPU에서 틱을 CPU의 최대 공칭 주파수로 나누는 것으로 충분합니다. 이 때문에 PyPy는 원시 값을 그대로 제공하고, 변환 작업은 외부 라이브러리에 맡깁니다.
투명 프록시 기능¶
만약 (–objspace-std-withtproxy를 통해) 투명 프록시가 활성화되어 있다면, 다음 함수들이 __pypy__에 들어갑니다:
tproxy(typ, controller): typ 타입인 것처럼 보이는 무언가를 반환합니다. 그 동작은 컨트롤러(controller)에 의해 완전히 제어됩니다. 자세한 내용은 transparent proxies를 참고하십시오.get_tproxy_controller(obj): obj가 실제로 투명 프록시(transparent proxy)라면 해당 컨트롤러를 반환합니다. 그렇지 않으면 None을 반환합니다.
시간 측정을 위한 추가 클록¶
time서브모듈은 CLOCK_BOOTTIME, CLOCK_MONOTONIC, CLOCK_MONOTONIC_COARSE, CLOCK_MONOTONIC_RAW 같은 플랫폼 종속적인 클록 타입과 두 개의 함수를 노출합니다:
clock_gettime(m)은 초 단위로 클록 타입의 시간을 반환하며clock_getres(m)는 초 단위로 시계 해상도를 반환합니다.
이들은 Python3.3+의 내장 time 모듈에 있으므로 PyPy3.11+에서는 __pypy__에서 제거되었습니다
확장 시그널 처리¶
thread.signals_enabled은 메인이 아닌 스레드에서 사용할 컨텍스트 관리자입니다.- “with” statement 안에서 시그널을 받을 수 있게 합니다. 정확히 말하면, 프로세스가 시그널을 받으면 시그널 핸들러는 (평소처럼) 메인 스레드에서 호출되거나, “with signals_enabled:” 안에 있는 다른 스레드에서 호출될 수 있습니다. 이 다른 스레드는 시그널 핸들러가 발생시킬 수 있는 예상치 못한 예외 — 특히 KeyboardInterrupt — 를 처리할 준비가 되어 있어야 합니다.
오버플로우를 고려한 정수 연산¶
intop은 long으로 오버플로되는 대신 2의 보수(two’s complement) 오버플로 동작을 갖는 정수 연산을 제공하는 모듈입니다.
py.py에서 사용 가능한 기능(변환 이후에는 사용 불가)¶
isfake(obj):obj가 fake인 경우 True를 반환합니다.