백엔드 개발 파이썬 튜토리얼 Python의 내부 작업

Python의 내부 작업

Nov 04, 2024 pm 01:45 PM

Internal Working Of Python

전체 코드 파일은 다음과 같습니다. Code

1. 소스코드

Python 스크립트를 작성하면 사람이 읽을 수 있는 텍스트입니다. 이 소스코드는 모든 것의 출발점입니다.

.py 파일로 작성된 Python 소스 코드는 사람이 읽을 수 있습니다. 이 코드는 변수, 함수, 루프 등을 지정하여 프로그램이 수행하는 작업을 정의합니다.

2. 바이트코드로 컴파일(컴파일러)

Python 프로그램을 실행할 때 첫 번째 단계는 소스 코드를 바이트코드로 컴파일하는 것입니다. 이는 Python 인터프리터에 의해 수행됩니다:

  • 구문 검사: 구문 오류가 없는지 확인합니다.
  • 컴파일: 상위 수준 소스 코드를 하위 수준의 플랫폼 독립적 표현인 바이트코드로 변환합니다. 이 바이트코드는 일반적으로 __pycache__ 디렉터리 내의 .pyc 파일에 있습니다.
    • 컴파일러: Python은 인터프리터를 사용하지만 먼저 소스 코드를 바이트코드라는 하위 수준 형식으로 컴파일합니다.
  • 토큰화: 코드를 토큰(예: 키워드, 연산자, 식별자)이라는 작은 조각으로 나눕니다.
  • 파싱: 토큰을 분석하여 Python의 구문 규칙을 따르는지 확인합니다.
  • 제어 흐름 그래프(CFG): 프로그램 실행 중에 프로그램을 통해 통과할 수 있는 모든 경로를 나타냅니다.
  • 바이트코드 생성: 구문 분석된 토큰을 Python 가상 머신(PVM)에 대한 명령 집합인 바이트코드로 변환합니다.

Internal Working Of Python

자세히 알아보겠습니다.

Python 컴파일러: Python은 해석 언어로 알려져 있지만 컴파일 단계가 있습니다. 분석 내용은 다음과 같습니다.

토큰화:

  • 코드를 토큰(예: 키워드, 연산자, 식별자)이라는 작은 조각으로 나눕니다.
  1. 소스 코드: 작성한 코드로 시작합니다.
  2. Tokenizer(Lexer): 소스 코드를 키워드(for, if), 연산자( , -), 식별자(변수 이름) 및 리터럴(숫자 또는 문자열 등)과 같은 토큰이라는 작은 조각으로 나눕니다. .
  3. 파싱: 토큰을 분석하여 Python의 구문 규칙을 따르는지 확인합니다.
  4. 구문 분석: 파서는 이러한 토큰을 가져와 Python의 문법 규칙과 비교하여 확인합니다.
  5. Parse Tree: 토큰에서 트리 구조를 구축하여 코드의 문법 구조를 나타냅니다.
  6. 의미론적 분석: 코드가 데이터 유형, 범위 및 기타 상황별 규칙 측면에서 의미가 있는지 확인합니다.
  7. 제어 흐름 그래프(CFG): 프로그램 실행 중에 프로그램을 통해 통과할 수 있는 모든 경로를 나타냅니다.
    • 제어 흐름 그래프: 실행 중에 코드를 통해 수행될 수 있는 모든 가능한 경로를 나타냅니다.
    • 노드와 에지: 각 노드는 코드의 기본 블록을 나타내고, 에지는 한 블록에서 다른 블록으로의 제어 흐름을 나타냅니다.
  8. 바이트코드 생성: 구문 분석된 토큰을 Python 가상 머신(PVM)에 대한 명령 세트인 바이트코드로 변환합니다.
    • 바이트코드는 실행에 최적화된 소스 코드를 보다 간결하고 낮은 수준으로 표현한 것입니다. 플랫폼 독립적이므로 호환되는 PVM이 있는 모든 시스템에서 실행할 수 있습니다.
    • 바이트코드: 구문 분석된 코드는 하위 수준의 플랫폼 독립적 표현인 바이트코드로 변환됩니다.
    • 명령어 세트: 이 바이트코드는 Python 가상 머신(PVM)이 실행할 수 있는 명령어 세트입니다. 바이트코드는 향후 실행 속도를 높이기 위해 __pycache__ 디렉터리의 .pyc 파일에 저장됩니다.

3. 바이트코드(Byte code) 로딩

컴파일 후 Python 가상 머신은 바이트코드를 로드합니다.

  • 캐시에서 읽기: 바이트코드가 이전에 컴파일되었고 변경되지 않은 경우 캐시(__pycache__)에서 읽습니다. 이렇게 하면 컴파일 단계를 건너뛰어 실행 속도가 빨라집니다.
    • 바이트코드가 메모리에 로드되어 실행될 준비가 되었습니다. 그런 다음 바이트코드는 PVM에 의해 실행되어 프로그램 작업을 수행하기 위한 지침을 해석합니다.

4. PVM(PVM)에 의한 실행

이제 PVM은 바이트코드를 해석하고 실행합니다.

  • 명령어 실행: PVM은 각 바이트코드 명령어를 읽고 실행합니다. 각 명령은 값 로드, 산술 수행 또는 함수 호출과 같은 특정 작업에 해당합니다.
  • 메모리 관리: 변수와 ​​객체에 대한 메모리 할당 및 할당 해제를 관리합니다.

Python의 메모리 관리:

  1. 참조 카운팅: Python은 메모리에 있는 객체에 대한 참조 수를 추적합니다. 참조 횟수가 0으로 떨어지면 객체가 차지한 메모리를 회수할 수 있습니다.
  2. 객체 할당: 코드가 실행될 때 Python 객체(예: 정수, 문자열, 목록)가 메모리에 생성됩니다.
  3. 가비지 수집: Python에는 더 이상 사용하지 않는 메모리(예: 참조 횟수가 0인 객체)를 할당 해제하여 메모리 관리를 돕는 가비지 수집기가 있습니다.
  4. 메모리 풀링: Python은 메모리 풀을 사용하여 작은 객체를 보다 효율적으로 할당합니다. 이 풀링은 작은 메모리 덩어리를 자주 할당하고 할당 취소하는 오버헤드를 줄이는 데 도움이 됩니다.
  5. 메모리 최적화: Python은 메모리 사용량을 최소화하기 위해 다음과 같은 다양한 최적화를 적용합니다.
    • PVM은 효율성을 높이기 위해 일부 구현(예: PyPy)에서 JIT(Just-In-Time) 컴파일과 같은 다양한 런타임 최적화를 수행합니다.
    • 작은 정수와 인턴된 문자열을 재사용합니다.
    • 데이터 구조(예: 튜플, 목록, 사전)를 효율적으로 관리합니다.

:

  • 바이트코드 캐싱: PVM은 소스 코드가 매번 다시 컴파일되는 것을 방지하기 위해 컴파일된 바이트코드를 캐시합니다. 이렇게 하면 후속 실행 속도가 빨라집니다.
  • 상수 접기: 런타임이 아닌 컴파일 타임에 상수 표현식을 단순화하는 작업이 포함됩니다. 예를 들어 3 * 2는 6으로 미리 계산될 수 있습니다.

요약하자면, PVM은 오케스트라 지휘자와 같아서 바이트코드를 컴퓨터가 실행할 수 있는 작업으로 원활하게 전환합니다. 아름다운 점은 PVM 덕분에 Python 코드가 이식 가능하고 수정 없이 다양한 플랫폼에서 실행될 수 있다는 것입니다.

바이트코드가 생성되었는지 여부를 어떻게 확인할 수 있나요?

Python 모듈을 가져오면 Python은 소스 코드를 바이트코드로 컴파일하여 __pycache__ 디렉터리에 저장합니다. 이렇게 하면 모듈을 가져올 때마다 다시 컴파일할 필요가 없으므로 향후 가져오기 속도가 빨라집니다.

과정은 다음과 같습니다.

  • 첫 번째 가져오기: 모듈을 처음 가져올 때 Python은 .py 파일을 바이트코드로 컴파일합니다.
  • pycache 디렉토리: 바이트코드는 module_name.cpython-312.pyc와 같은 이름의 __pycache__ 디렉토리에 저장됩니다. # 312는 파이썬 버전입니다.
  • 후속 가져오기: 후속 가져오기에서 Python은 __pycache__ 디렉터리에서 컴파일된 바이트 코드를 확인하고 소스 코드가 변경되지 않은 경우 이를 사용하여 가져오기 프로세스 속도를 높입니다.

예:

byte.py가 있습니다. byte.py를 실행한 후 hello_world.py에서 코드를 가져오면 해당 폴더에 __pycache__ 디렉터리가 있고 .pyc 파일을 볼 수 있습니다.

from hello_world import greet

greet("Byte code")


로그인 후 복사
로그인 후 복사

py_compile을 사용하여

py_compile 모듈: Python 소스 파일을 바이트코드 파일로 컴파일할 수 있습니다. 이는 향후 실행을 위해 스크립트 실행 속도를 높이는 편리한 방법입니다.

byte.py에서

import py_compile

py_compile.compile('hello_world.py')

로그인 후 복사
로그인 후 복사
  • py_compile 모듈은 hello_world.py를 바이트코드로 컴파일합니다.
  • 결과 바이트코드는 pycache 디렉터리에 저장되어 hello_world.cpython-38.pyc(또는 Python 버전에 따라 유사)라는 파일이 생성됩니다.

바이트코드 생성:

  • 바이트코드를 생성하기 위해 전체 스크립트가 실행됩니다. 이는 모든 최상위 코드(예: print("Hello, World!") 및 print("c"))가 컴파일 프로세스 중에 실행된다는 의미입니다.

결과 바이트코드:

  • 바이트코드에는 Python이 향후 스크립트 가져오기 속도를 높이기 위해 사용하는 모든 함수, 클래스 및 실행 가능 문이 포함되어 있습니다.

dis 모듈

Python의 dis 모듈은 바이트코드를 더 읽기 쉬운 형식으로 분해하는 데 사용됩니다. 이는 Python 코드가 내부적으로 수행하는 작업을 이해하는 데 도움이 될 수 있습니다. Python의 내부를 디버깅하거나 학습하는 데 특히 유용합니다.

  • internal.py에는
from hello_world import greet

greet("Byte code")


로그인 후 복사
로그인 후 복사

산출

import py_compile

py_compile.compile('hello_world.py')

로그인 후 복사
로그인 후 복사
  • 프로그램은 CPython 바이트코드를 분석하기 위한 강력한 도구인 dis 모듈을 가져오는 것으로 시작됩니다. CPython은 Python의 기본 구현이며 바이트코드는 Python 인터프리터의 중간 언어입니다.
  • 다음으로 Greeting이라는 간단한 함수를 정의했습니다. 이 함수는 매개변수 이름을 입력받아 인사말을 인쇄합니다. 함수 자체는 매우 간단하지만 Python의 내부적으로 일어나는 일은 표면에서 보이는 것보다 더 복잡합니다.
  • disassemble_function 함수는 disassemble 함수를 분해하기 위해 dis.dis()를 사용합니다. dis.dis()는 Python 함수를 Python의 가상 머신이 실제로 실행하는 하위 수준 바이트 코드로 변환합니다. 이 바이트코드는 우리의 Greeting 함수에 대한 Python의 해석이며 기계어 코드에 한 단계 더 가까워졌습니다.
  • 스크립트가 disassemble_function()을 호출하면 콘솔 출력에 Greeting 함수의 바이트코드가 표시됩니다.

바이트코드가 알려주는 내용은 다음과 같습니다.

  • LOAD_GLOBAL(0): 이 opcode는 전역 변수(이 경우 인쇄 기능)를 로드하는 데 사용됩니다.
  • LOAD_CONST(1): 상수 값 'Hello,'를 스택에 로드합니다.
  • LOAD_FAST(0): 이 opcode는 지역 변수 이름을 스택에 로드합니다.
  • FORMAT_VALUE(0): 이름 문자열의 형식을 지정하여 생성할 문자열에 삽입할 수 있도록 준비합니다.
  • BUILD_STRING(2): 스택의 상위 두 값('Hello' 및 name)을 가져와 최종 문자열을 작성합니다.
  • CALL_FUNCTION(1): 이 줄은 괄호 안에 인수 개수를 사용하여 함수(스택에 로드한 전역 인쇄 함수)를 호출합니다(우리는 하나의 인수, 형식화된 문자열을 가집니다).
  • POP_TOP: 스택의 맨 위를 제거합니다(print가 None을 반환하므로 이전 호출의 결과).
  • LOAD_CONST(0): 로드 없음.
  • RETURN_VALUE: Greeting 함수의 반환값으로, 명시적인 반환문이 없으므로 None입니다.
  • 본질적으로 바이트코드는 Python이 인사 기능을 실행하기 위해 수행하는 개별 작업을 보여줍니다. 이러한 지침을 이해하는 것은 개발자가 Python이 코드를 실행하고, 기능을 최적화하고, 리소스를 관리하는 방법을 이해하는 데 중요합니다. 이 모든 작업은 Python 코드를 실행할 때 내부적으로 원활하게 발생합니다.

Python 기계실로의 즐거운 다이빙이 아닌가요? 계속 코딩하고 이 언어 엔진룸의 깊이를 계속 탐색해 보세요?!

위 내용은 Python의 내부 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? 중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? Apr 02, 2025 am 07:15 AM

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? 10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? Apr 02, 2025 am 07:18 AM

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

Inversiting.com의 크롤링 메커니즘을 우회하는 방법은 무엇입니까? Inversiting.com의 크롤링 메커니즘을 우회하는 방법은 무엇입니까? Apr 02, 2025 am 07:03 AM

Investing.com의 크롤링 전략 이해 많은 사람들이 종종 Investing.com (https://cn.investing.com/news/latest-news)에서 뉴스 데이터를 크롤링하려고합니다.

SCAPY 크롤러를 사용할 때 파이프 라인 파일을 작성할 수없는 이유는 무엇입니까? SCAPY 크롤러를 사용할 때 파이프 라인 파일을 작성할 수없는 이유는 무엇입니까? Apr 02, 2025 am 06:45 AM

SCAPY 크롤러를 사용할 때 파이프 라인 파일을 작성할 수없는 이유에 대한 논의 지속적인 데이터 저장을 위해 SCAPY 크롤러를 사용할 때 파이프 라인 파일이 발생할 수 있습니다 ...

Python 3.6 피클 파일로드 오류 modulenotfounderRor : 피클 파일 '__builtin__'를로드하면 어떻게해야합니까? Python 3.6 피클 파일로드 오류 modulenotfounderRor : 피클 파일 '__builtin__'를로드하면 어떻게해야합니까? Apr 02, 2025 am 06:27 AM

Python 3.6에 피클 파일 로딩 3.6 환경 오류 : ModulenotFounderRor : nomodulename ...

See all articles