1. 파이썬의 장단점
1-1) 간결한 문법
코드가 문법상 간결한 편이기 때문에 생산성이 높고 적은 코드로 더 많은 작업 수행이 가능합니다.
코드가 간결해진 이유중 하나는 파이썬은 메모리를 프로그래머가 관리하는 것이 아닌 파이썬 인터프리터가 관리해주기
떄문입니다. 이 떄문에 메모리 관련 코드는 간결해집니다
1-2) 높은 확장성 및 이식성
파이썬은 다른 언어나 라이브러리에 쉽게 접근해 연동이 가능합니다
flask, django 같은 프레임워크에 접근하거나
numpy : 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리할 수 있도록 지원하는 파이썬의 라이브러리
TensorFlow : 딥 러닝 및 머신 러닝을 위한 오픈 소스
PyTorch : 딥 러닝 및 기계 학습을 위한 오픈 소스 프레임워크. 동적 계산 그래프를 사용하여 딥 러닝 모델을 구축하고 학습하는 데 사용된다.
텐서 처리 및 자동 미분을 통한 모델 학습을 지원
OpenCV : 컴퓨터 비전 및 이미지 처리를 위한 오픈 소스 라이브러리.이미지 및 비디오 처리, 객체 감지, 얼굴 인식, 패턴 인식
1-3) 활발한 생태계
난 프론트엔드 개발을 목표로 한 개발자임. 하지만 1년전부터 ai 관련 오픈소스들에 대해 관심이 크게 생겼고
이 때 대부분의 오픈소스들이 파이썬으로 이루어져 있는 것을 확인함. 이를 통해 활발한 생태계를 직접 볼 수 있었음
이를 통해 파이썬을 공부해야한다는 느낌을 많이 받아 캠프에 지원하기까지 이르렀다.
그리고 높은 확장성에서 말하는 많은 라이브러리와 프레임워크들도 활발한 생태계의 증거물들이다.
단점
1-a) 위에서 말한 파이썬 인터프리터가 메모리를 직접 관여하기 떄문에 메모리 소비가 심해지고 느려집니다.
1-b) GIL(Global Interpreter Lock). 하나의 스레드에 모든 자원을 허락하고 나머지 스레드에 락을 걸어 다른 스레드가 실행되지 않도록 막아버리는 기능 때문에 병렬로 작동하지 않아 느림.
1-c) 런타임 오류
Python은 인터프리터 언어로 먼저 컴파일된 후 실행되지 않는다.정확히는 실행할 때마다 컴파일되므로 실행 시 코딩 오류가 나타난다. 이 모든 것이 결국 성능 저하, 시간 소비 및 많은 테스트의 필요성으로 이어진다.
그럼 파이썬에서는 병렬작업이 불가능한가?
>>>3가지가 있음
멀티스레딩(multithreading) : 부모 프로세스의 메모리 콘텍스트를 공유하는 여러 처리 스레드들을 실행한다.
가장 유명하고 오래된 동시성 모델이며 입출력(I/O)이 많이 수행되거나
사용자 인터페이스 응답성을 유지해야 하는 애플리케이션에서 효과적으로 작동한다.
매우 경량이지만 사용 시 많은 주의가 필요하고 메모리 안전 리스크를 내포한다.
멀티프로세싱(multiprocessing) : 여러 독립 프로세스를 실행해 분산된 환경에서 작동하도록 한다.
동작 자체는 스레드와 유사하지만 공유 메모리 콘텍스트에 의존하지 않는다.
파이썬의 특성상 CPU를 많이 사용(CPU-intensive)하는 애플리케이션 보다 적합하다.
멀티스레딩보다 무거우며 프로세스 간 통신 패턴(inter-process communication pattern)을
구현해 프로세스들이 조화롭게 동작하도록 해야 한다
비동기 프로그래밍 (asynchronous programming) : 여러 협력적 태스크들은 단일 애플리케이션 프로세스에서 실행한다.
협력적 태스크들은 스레드처럼 작동하지만 태스크 전환은 운영체제 커널이 아니라 애플리케이션 자체에서 촉진한다.
I/O 바운드(I/O bound) 애플리케이션, 특히 동시다발적인 네트워크 커넥션을 다루는 프로그램에 적합한다.
비동기 프로그래밍의 단점은 전용 비동기 라이브러리를 사용해야 한다는 것이다
스레딩과 프로세스의 차이
프로세스 (Process) : 운영체제로부터 자원을 할당받은 작업의 단위
스레드 (Thread) : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
프로그램과 프로세스
프로그램은 윈도우의 *.exe 파일처럼 컴퓨터에서 실행 할 수 있는 파일을 통칭한다.
단, 아직 파일을 실행하지 않은 상태이기 때문에 정적 프로그램(Static Program) 줄여서 프로그램(Program)이라고 부른 것
프로세스 (Process)
프로그램이 그냥 코드 덩어리이면,
프로세스는 프로그램을 실행 시켜 정적인 프로그램이 동적으로 변하여 프로그램이 돌아가고 있는 상태를 말한다
스레드의 개념
스레드란, 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위 를 말한다.
Python에서 멀티스레드는 의미가 없는가?
>>> GIL는 cpu동작에서 적용되는걸 말하며 cpu동작을 마치고
I/O작업을 실행하는 동안에는 다른 스레드가 동시에 동작할 수 있습니다.
GIL의 존재 이유?
>>>파이썬의 메모리 관리하는 방법에 기여함
파이썬에 존재하는 모든 것은 객체임.
파이썬은 이러한 객체들에 대해 참조 횟수(Reference count)를 저장함.
참조 횟수는 각 객체들이 참조되는 횟수를 나타내고 참조 여부에 따라 알아서 증감함
참조 횟수가 0이 된다면 파이썬의 GC(Garbage Collector)가 그 객체를 메모리에서 삭제함.
하지만 만약에 여러 스레드에서 동시에 한 객체에 접근하면 그 객체의 참조 횟수에 대해
race condition(하나의 자원을 동시에 사용하게 될 때 기대하지 않은 결과 발생)이 발생하게 되고 GC의 부적절한 행동을 야기함
이 때문에 GIL을 통해 한 스레드만 자원에 접근하게 만듬.
가비지 컬렉터가 어떤 기준으로 어떻게 순환 참조를 감지하는가?
가비지 컬렉터는 세대와 임계값으로 가비지 컬렉션
2. 파이썬이 느린 이유
2-1) 파이썬은 메모리를 프로그래머가 관리하는 것이 아닌 파이썬 인터프리터가 관리해주기
떄문에 메모리 소비가 심해지고 느려짐
2-2) GIL로 인해 cpu가 병렬적으로 스레드를 활용하지 않기 때문에 하지만 I/O작업을 실행하는 동안에는 다른 스레드가 동시에 동작할 수 있습니다.
3. 가상환경이란?
자신만의 개발 환경.
제 경험적으로 vscode 기준 말하면 2가지로 나뉘어짐
글로벌 가상환경 : 커맨드 팔레트에서 파이썬 create environment를 클릭하고 venv를 클릭하고 파이썬 버전하면 클로벌 가상환경이 프로젝트에 자동으로 깔림.
프로젝트 가상환경 : python -m venv 11111 '11111'이라는 가상환경의 폴더가 생김.
패키지 관리 시스템인 pip를 사용하여 여러 라이브러리나 프레임워크를 자유자재로 사용할 수 있음
4. 환경 변수란?
지역 변수, 전역 변수, 환경 변수 중 하나로 프로그램의 실행 환경에서 접근 가능한 변수.
운영체제가 프로그램이 동작할 때 필요한 정보를 담은 것
path는 프로그램의 기본 경로를 담당하는 환경변수이다.
환경 변수 안의 사용자 변수와 시스템 변수는?
사용자변수: 컴퓨터에 있는 각 계정에서 사용하는 변수. 해당 사용자의 계정으로 컴퓨터에 로그인 시에만 적용되는 변수.
시스템 변수 : 시스템 전반에 걸쳐 적용되는 변수, 즉 전역변수와 같은 개념이다.
헷갈리면 대학생 때 첫 자바 설치해서 path에 자바 환경설정 할 때를 기억해
그래서 os 내에서 어디서든지 자바를 불러내면 path에 지정해둔 자바가 나타난걸 기억해