__pypy__ 모듈¶
__pypy__ 모듈은 PyPy의 표준 인터프리터가 제공하는 특수 기능에 접근하는 주요 진입점입니다. 이 모듈의 내용은 설정 옵션에 따라 달라집니다. 설정 옵션은 새로운 기능과 함수를 추가할 수 있으며, 이러한 함수가 있는지 없는지를 보고 해당 기능의 존재 여부를 알 수 있습니다. 이들은 일반적으로 CPython에서는 C로 작성된 모듈을 순수 Python 모듈로 작성할 때 호환성을 위해 사용됩니다. 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로 구현된 모듈을 애플리케이션 수준에서 구현하기 위한 것입니다. 이 데코레이터는 함수가 메서드처럼 바인딩되는 일이 절대 없도록 보호합니다. 일부 테스트에서는 “내장(built-in)” 함수를 클래스에 넣고 인스턴스를 통해 접근하는 식의 작업을 하기 때문에 유용합니다.
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): 객체가 현재 사용하고 있는 내부 전략(strategy)을 반환합니다.
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를 반환합니다. 워치포인트를 평가할 때 부작용이 전혀 발생하지 않도록(캐싱도 하지 않도록) 하는 것은 여러분의 책임입니다. 이 함수는 이를 조금이나마 돕기 위한 것입니다—다음과 같이 작성할 수 있습니다:if not __pypy__.side_effects_ok(): skip the caching logic워치포인트에서 사용할 수 있도록 getter 메서드나 프로퍼티 내부에서. 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(...)는 Python 코드를 거치지 않고 OS 환경 변수를 가져옵니다.
_pypydatetime은 순수 Pythondatetime표준 라이브러리 모듈에 올바른 C API 상호 작용을 갖춘 기반 클래스를 제공합니다.
빠른 문자열 연결¶
제자리 연결(+=) 대신 이것들을 사용하면 복사를 최소화하면서 문자열을 빠르게 만들 수 있습니다.
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: 로그를 플러시합니다.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 틱을 나노초로 변환하는 신뢰할 수 있는 표준 방법은 없는 것으로 보입니다. 다만 실제로 최신 CPU에서는 틱을 CPU의 최대 공칭 주파수로 나누는 것으로 충분합니다. 이러한 이유로 PyPy는 원시 값을 그대로 제공하고, 변환 작업은 외부 라이브러리에 맡깁니다.
투명 프록시 기능¶
(–objspace-std-withtproxy로) 투명 프록시가 활성화되어 있으면 다음 함수들이 __pypy__에 추가됩니다:
tproxy(typ, controller): typ 타입인 것처럼 보이는 객체를 반환합니다. 이 객체의 동작은 전적으로 controller가 제어합니다. 자세한 내용은 투명 프록시에 관한 문서를 참조하십시오.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” 문 안에서 시그널을 수신할 수 있게 합니다. 더 정확히 말하면, 프로세스가 시그널을 수신하면 시그널 핸들러는 (평소처럼) 메인 스레드에서 호출될 수도 있고, “with signals_enabled:” 안에 있는 다른 스레드에서 호출될 수도 있습니다. 이 다른 스레드는 시그널 핸들러가 발생시킬 수 있는 예기치 않은 예외, 특히 KeyboardInterrupt를 처리할 준비가 되어 있어야 합니다.
오버플로를 고려한 정수 연산¶
intop은 long으로 오버플로하는 대신 2의 보수 방식으로 오버플로하는 정수 연산을 담은 모듈을 제공합니다
py.py에서 사용할 수 있는 기능(변환 후에는 사용할 수 없음)¶
isfake(obj):obj가 가짜(faked) 객체이면 True를 반환합니다.