Python

덤프버전 : r20240101

분류

파일:다른 뜻 아이콘.svg
파이썬은(는) 여기로 연결됩니다.
다른 뜻에 대한 내용은 파이선 문서
파이선번 문단을
파이선# 부분을
, {{{#!html }}}에 대한 내용은 문서
#s-번 문단을
#s-번 문단을
# 부분을
# 부분을
, {{{#!html }}}에 대한 내용은 문서
#s-번 문단을
#s-번 문단을
# 부분을
# 부분을
, {{{#!html }}}에 대한 내용은 문서
#s-번 문단을
#s-번 문단을
# 부분을
# 부분을
, {{{#!html }}}에 대한 내용은 문서
#s-번 문단을
#s-번 문단을
# 부분을
# 부분을
, {{{#!html }}}에 대한 내용은 문서
#s-번 문단을
#s-번 문단을
# 부분을
# 부분을
, {{{#!html }}}에 대한 내용은 문서
#s-번 문단을
#s-번 문단을
# 부분을
# 부분을
, {{{#!html }}}에 대한 내용은 문서
#s-번 문단을
#s-번 문단을
# 부분을
# 부분을
, {{{#!html }}}에 대한 내용은 문서
#s-번 문단을
#s-번 문단을
# 부분을
# 부분을
, {{{#!html }}}에 대한 내용은 문서
#s-번 문단을
#s-번 문단을
# 부분을
# 부분을
참고하십시오.






이 문서는 나무위키의 이 토론에서 "도서의 구체적인 이름은 네이버 책 서비스 기준으로 작성자가 다른 최근 1년 네티즌리뷰가 5개 이상이거나 1개 이상 대학에서 교육용으로 사용되고 있을 때 서술 가능하다. 이를 충족하지 않으면 서술에서 제거할 수 있다. 이미지는 등록하지 않는다."(으)로 합의되었습니다.
타 위키에서의 합의내용이 더위키에서 강제되지는 않지만 문서를 편집하실때 참고하시기 바랍니다.



프로그래밍 사이트 선정 프로그래밍 언어 순위 목록

⠀[ IEEE Spectrum 2021 ]⠀
{{{#!wiki style="display: inline-block; margin: 0 0 -5px; min-width: 25%"
⠀[ Stack Overflow 2022 ]⠀
{{{#!wiki style="display: inline-block; margin: 0 0 -5px; min-width: 25%">
⠀[ TIOBE 2023 ]⠀

프로그래밍 언어 목록 · 분류 · 문법

TIOBE 선정 올해의 프로그래밍 언어 / Python

[ 펼치기 · 접기 ]
2006년
Ruby

2007년
Python

2008년
C
2009년
Go

2010년
Python

2011년
Objective-C
2017년
C

2018년
Python

2019년
C
2019년
C

2020년
Python

2021년
Python
2020년
Python

2021년
Python

2022년
C++


[각주]



파이썬
Python

파일:Python 로고.svg
개발 단체
Python 소프트웨어 재단 (PSF)
라이선스
PSF 라이선스
최초 공개
1991년 출시
최신 버전
3.12.0 (2023년 10월 2일 출시)[1]
링크
파일:홈페이지 아이콘.svg

1. 개요
2. 상세
3. 특징
3.1. 디자인 철학
3.2. 명확한 권장 코드 스타일
3.3. 순수 객체 지향
3.4. 반복 가능한 객체
4. 장점
4.1. 신속한 개발 속도
4.2. 피드백의 용이성
4.3. 과학 및 공학 친화성
4.4. 거대한 생태계
4.5. 교육의 편의성
5. 단점
5.1. 비교적 느린 실행 속도
5.2. 일반 사용자에게의 배포
5.3. 점점 어려워지는 난이도
7. 개발 환경
7.1. 명령줄 인터페이스
7.2. 통합 개발 환경
7.3. 코드 편집기
7.4. 노트북 편집기
7.5. 패키지 관리
7.6. 가상 환경
7.7. 버전 관리 시스템
8. 주요 패키지
8.1. 코드 퀄리티 관리
8.2. 수학
8.3. 데이터베이스
8.4. 데이터 처리 및 통계분석
8.5. 그래프 그리기
8.6. 머신 러닝
8.7. 그래픽 사용자 인터페이스(GUI)
8.8. 웹 서버
8.9. 확장 모듈
8.10. 외부 함수 인터페이스(FFI)
8.11. 기타
10. 학습
10.1. 유튜브
10.2. 위키독스
10.3. 도서
11. 여담
12. 둘러보기



1. 개요[편집]


Life is short, you need Python.

인생은 짧기에, 당신에겐 Python이 필요하다.[2]

파이썬은 1991년에 발표된 인터프리터 방식의 프로그래밍 언어이다. 파이썬의 강력한 라이브러리와 풍부한 생태계를 통해, 데이터를 수집하고 분석하며 시각화하기 용이하다. 데이터 분석 분야에서 파이썬의 사용이 널리 퍼진 이유 중 하나는, 다른 프로그래밍 언어에 비해 직관적이기 때문에 비교적 쉽고 간편하게 사용할 수 있기 때문이다. 파이썬은 웹 프레임워크와 같은 라이브러리와 함께 사용될 경우, 데이터를 수집하고 처리한 후 결과를 웹 애플리케이션으로 표시하는 것도 가능하다.

2. 상세[편집]


창시자는 네덜란드의 프로그래머 귀도 반 로섬(Guido van Rossum).[3][4] 1989년 크리스마스 주에, 연구실이 닫혀있어서 심심한 김에 만든 프로그래밍 언어이다. 농담이 아니고 반 로섬을 유럽에서는 애덤 스미스에 비교할 정도며, 네덜란드에서는 기술자의 대명사로 취급된다. 심심해서 만들었다는 것은 Python 서문마이크로소프트웨어와 한 인터뷰를 보면 알겠지만 사실이다. 능력 있는 기술자들은 대부분 심심할 때, 혹은 실수로 걸작을 만든다. 그리고 Python이라는 이름은 귀도가 즐겨 보던 영국의 6인조 코미디 그룹 몬티 Python에서 따왔다고 한다.[5]

문법이 단순해서 초보자들이 프로그래밍을 할 때 추천되는 언어이다. 오죽하면 Python의 별명이 "실행할 수 있는 의사 코드(Executable pseudocode)"일 정도. 학습용으로 좋은 언어인 동시에 실사용률과 생산성도 높은 대단히 강력한 언어인 셈. [6]

2023년 10월 기준 공식 버전은 3.12이다. 0.1~0.0.1 버전마다 함수나 연산 개선이 존재하므로 귀찮더라도 꾸준히 업데이트하기를 추천.

Python 소프트웨어 재단(PSF)에서는 공식 문서로 Python 개선 제안(PEP)이라는 것을 작성하고 있다. 글 작성 순서에 따라 PEP 8, PEP 20과 같이 번호를 붙인다. 이는 Python 코드의 일관성과 발전 방향의 통일을 위해 작성하는 것으로, 이 PEP는 Python 코드가 지켜야할 규칙이다.

온라인으로 실행시켜 보고 싶다면 여기로.


3. 특징[편집]



3.1. 디자인 철학[편집]


'가장 아름다운 하나의 답이 존재한다'를 기본으로 하고 있다.[7]

예를 들어 팩토리얼 함수는 다음과 같이 간결히 나타낼 수 있다. 이 예시에서는 프로그래밍 초보자들을 헷갈리게 하는 3항 연산자(Ternary operator)도 쉽게 읽혀 Python의 "실행할 수 있는 의사 코드"라는 별명을 다시금 느낄 수 있다.[8]
def factorial(x):
    return 1 if x == 0 else x * factorial(x - 1)
[* 더 쉽게는 {{{#!syntax python
def factorial: return 1 if x == 0 else x * factorial(x - 1)}}} 과
factorial = lambda x: 1 if x == 0 else x * factorial(x - 1)
이런 식도 가능하다]
이것은 남이 작성한 코드를 내가 읽고 이해해야 하는 경우 아주 절실히 느낄 수 있다. PEP 20에서 제시된 Python 기본 철학(The Zen of Python)에 자세히 나열되어 있다.

1. 아름다운 것이 추한 것보다 낫다. (Beautiful is better than ugly.)

1. 명시적인 것이 암시적인 것보다 낫다. (Explicit is better than implicit.)

1. 간결한 것이 복합적인 것보다 낫다. (Simple is better than complex.)

1. 복합적인 것이 복잡한 것보다 낫다. (Complex is better than complicated.)

1. 수평적인 것이 내포된 것보다 낫다. (Flat is better than nested.)

1. 여유로운 것이 밀집한 것보다 낫다. (Sparse is better than dense.)

1. 가독성은 중요하다. (Readability counts.)

1. 특별한 경우들은 규칙을 어길 정도로 특별하지 않다. (Special cases aren't special enough to break the rules.)

1. 허나 실용성은 순수성을 이긴다. (Although practicality beats purity.)

1. 오류는 절대로 조용히 지나가지 않는다. (Errors should never pass silently.)

1. 명시적으로 오류를 감추려는 의도가 아니라면. (Unless explicitly silenced.)

1. 모호함을 대할 때, 이를 추측하려는 유혹을 거부하라. (In the face of ambiguity, refuse the temptation to guess.)

1. 명확한, 그리고 가급적이면 유일한 하나의 방법은 항상 존재한다. (There should be one-\- and preferably only one -\-obvious way to do it.)

1. 비록 그 방법이 처음에는 명확해 보이지 않을지라도[9]

. (Although that way may not be obvious at first unless you're Dutch.)

1. 지금 행동에 옮기는 것이 아예 안 하는 것보다는 낫다. (Now is better than never.)

1. 비록 아예 안 하는 것이 지금 *당장* 하는 것보다 나을 때도 많지만. (Although never is often better than *right* now.)

1. 구현 결과를 설명하기 쉽지 않다면, 그것은 나쁜 아이디어이다. (If the implementation is hard to explain, it's a bad idea.)

1. 구현 결과를 설명하기 쉽다면, 그것은 좋은 아이디어일지도 모른다. (If the implementation is easy to explain, it may be a good idea.)

1. 네임스페이스를 사용하는 것은 완전 좋은 생각이다! (Namespaces are one honking great idea -- let's do more of those!)

따라서 다른 언어들의 코딩 스타일은 각자의 취향에 맞게 발산 진화하는 반면, Python은 위의 철학들을 만족시키는 하나의 스타일로 수렴 진화하는 성향이 있다.[10] 이런 성향은 다른 언어에는 없는 Python스러움(pythonic)이라는 독특한 개념을 낳게 되었는데, 복잡하지 않으면서 의미가 명확하고, 코드의 축약보다 뚜렷하게 보이는 흐름을 중시하는 Python의 철학을 지칭하는 개념이다.


3.2. 명확한 권장 코드 스타일[편집]


특유의 철학 때문에 코딩 스타일에 엄격한 편이다. 잘 작동하는지와는 별개로 가독성을 위해 이렇게 쓰기를 권장한다는 스타일 가이드까지 있다. Python 공식 문서에서는 Python에 맞는 코딩 스타일을 지키기를 권장하는데, 이것이 바로 PEP 8이다.

  1. 블록 처리 규칙
보통 다른 언어에서는 중괄호를 블록 단위로 사용하지만,[11] Python에서는 중괄호 대신 들여쓰기를 사용한다. 이 들여쓰기 문법 때문에 PEP 8에 명시된 공식 코딩 가이드에서는 소스 코드 들여쓰기에 탭(Tab) 문자 대신 공백(Space) 4문자를 넣기를 매우 강력히 권장한다.[12][13] 문자는 사용자나 시스템의 설정에 따라 서로 다른 폭의 공백이 생긴다. 문제는 Python 인터프리터가 탭 문자 하나를 공백 1문자로 처리한다는 것이다. 탭 문자로 들여쓰기를 처리하면 자신과 다른 탭 설정을 가진 편집기에서 코드를 열어 볼 경우 코드 들여쓰기가 높은 확률로 망가져 버리고, 그걸 교정해 보겠다고 들여쓰기에 공백 문자를 혼용하는 순간 해당 소스 코드는 사람이 고칠 수 없는 형태로(시각적으로는 블록이 맞지만 Python 인터프리터는 다른 블록으로 인식) 망가져 버린다. 물론 이렇게 스페이스 바를 네 번이나 치는 귀찮은 행위를 프로그래머들이 가만 놔둘 리가 없다. PyCharm, VSCode 등 Python 개발자들이 애용하는 편집기는 탭 키 누르면 공백 4개로 자동 변환되어 입력되는 기능이 지원되므로 이들 편집기를 이용하면 공백 4개를 번거롭게 칠 필요가 없어진다.[14]
return x * factorial(x - 1)else:

">
  1. 작명 규칙
Python에서는 변수나 클래스 이름을 어떻게 짓든 잘 작동한다. 그렇지만 PEP 8 에서는 이에 대한 권장 스타일도 명시하고 있다.[예외] Python을 코딩할 때에는 가독성을 위해 이 권장 스타일을 따르는 것이 좋다.
아래는 이름에 대한 대표적인 스타일 가이드이다.
  • 일반적으로 스네이크 표기를 쓰되, 특정한 종류에는 파스칼 표기를 쓴다. 표기법은 코딩 스타일 참고.
  • 변수는 소문자로 시작하며 [15], 내부변수(internal)는 맨 앞에 밑줄(underbar, _) 1개로 시작하며, 숨은변수(hidden)은 밑줄 2개로 시작한다.
    • attribute_name = 0
    • _protected_attribute_name = 0
    • __hidden_attribute_name = 0
종류
규칙
예시
패키지(package)
스네이크()

모듈(module)
스네이크()
import module_name
클래스(class)
파스칼()
class ClassName()
예외(exception)
파스칼

함수(function)
스네이크()
def function_name()
상수(constant)
대문자+밑줄
MODULE_CONSTANT_NAME = 0
변수(variable)
스네이크
variable_name = 0
매개변수(parameter)
지역변수
인스턴스 변수(instance variable)
메서드(method)
스네이크()
method_name()
  1. 문법 규칙
아래는 권장되는 대표 유형이다.
  • 한 줄은 79글자로 제한하기
  • import는 파일의 맨 위에 적고 내장 모듈, 제3자 모듈, 직접 만든 모듈 순서로 불러들이기
  • 인스턴스 메서드의 첫 인자는 self로 쓰고, 클래스 메서드의 첫 인자는 cls로 쓰기
  • 할당 연산자(=)의 앞뒤로 공백 넣기

작성한 코드가 PEP8 스타일 가이드를 지키는지 확인해 주는 Python 패키지도 있는데, Pylint와 Flake8 등이 대표적이다. 코드 스타일을 자동으로 권장 사항에 맞추어 수정해 주는 Python 패키지도 있는데, Black[16]이 대표적이다. PyCharm이나 Visual Studio Code 등의 IDE는 이들 도구를 확장 기능으로 제공하여 에디터 GUI 화면 상에서 편리하게 사용할 수 있다. vscode는 pylance를 공식으로 권장하고 있다.

3.3. 순수 객체 지향[편집]


Python에는 원시 타입(Primitive Type)이 존재하지 않으며, 모든 것이 객체로 취급된다. 나아가 클래스, 함수 역시 객체로 취급할 수 있다. 파이썬은 실행중 타입검사가 없어서 상수 역시 문법이 아닌 코딩규칙이고 파이썬이 검사하지않는다. 상수가 저장된 객체라고 본다. 다음과 같은 상수 할당문이 있을 때,
X = 10

이는 변수 x 자체에 10이 할당된 것이 아니라 x가 10이 저장된 상수 객체를 가리키는 것을 의미한다. 내부적으로는 C의 포인터 연산과 같은 동작이 행해지는 것이다. 이렇게 x에 대입되는 값을 변경할 경우,
X = 10
X = 20

X가 가리키는 대상이 10이 저장된 상수 객체에서 20이 저장된 상수 객체로 바뀐 것이다. X 자체의 값이 10에서 20으로 바뀐 게 아니다. 파이썬에서 타언어의 상수와 같은것을 만들려면 클래스를 통해 불변객체를 만들어야한다면

파일:2-4-4.png
Python 버전 3의 표준 타입 계층 구조에서 주요 자료형은 그림과 같다. 이 중에서도 크게 불변 객체(Immutable Object)와 가변 객체(Mutable Object)로 나눌 수 있다. 불변 객체에는 숫자, 문자열, 바이트, 그리고 튜플[17]이 있다. 이 네 가지를 제외한 나머지 객체는 모두 가변 객체이며, 값을 수정할 수 있다. 불변 객체의 값을 수정할 때는 바뀐 값이 저장된 새로운 객체를 생성하고 참조 대상을 새 객체로 옮기는 식으로 동작한다. 이와 같은 특징 때문에 Python은 순수 객체지향 언어라고 할 수 있고, 이와 같은 순수 객체 지향 언어의 또 다른 예로는 Ruby가 있다. 파이썬의 객체관련 문법은 클래스내 this 가 없고 self 키워드만 있는등 c++ 보다는 객체지향언어의 원조격인 스몰토크언어에 영향을 많이 받았다.[18]

다만 객체 지향 언어라는 표현은 주의해서 사용할 필요가 있다. 객체 지향은 어디까지나 프로그래밍 패러다임이므로, Python이 객체 지향 언어임은 프로그램 작성이 항상 객체 지향으로 이루어진다는 의미는 아니다. 대부분 처음 Python을 배울 때는 절차 지향적으로 프로그래밍을 하게 되며, 심지어 함수형 프로그래밍도 할 수 있다.

함수의 매개 변수로 불변 객체를 넘겼냐 가변 객체를 넘겼냐에 따라서 함수 바깥에 있는 인자의 값도 수정할 수 있는지 없는지가 달라진다. 불변 객체를 넘겼으면 값의 복사만 일어나고 함수 바깥에는 영향을 주지 못하므로[19] '값에 의한 호출(Call by Value)'이 될 것이며, 가변 객체를 넘겼으면 함수 바깥에까지 영향을 줄 수 있으므로 '참조에 의한 호출(Call by Reference)'이 될 것이다. Python 공식 문서에서는 Python의 인자 전달 방식을 '할당에 의한 호출(Call by Assignment)', 또는 '객체 참조에 의한 호출(Call by Object Reference)'이라고 명시하고 있다.


3.4. 반복 가능한 객체[편집]


Python의 가장 큰 특징 중 하나. Python은 반복 가능한 객체(iterable)라는 강력한 기능을 제공한다. 이 객체는 집합, 문자열, 리스트, 튜플, 딕셔너리, 그리고 함수[20]까지도 반복이 가능하며, 이것을 for 구문에서 사용할 수 있게 해준다. 리스트와 튜플 등은 좀 편해지는 정도라 할 수 있지만, 함수의 값을 반복할 수 있다는 것은 큰 장점이다. 그 예로 n의 배수를 구하는 f(n) 함수가 있을 때,
def f(n):
    x = 1
    while True:
        yield n*x
        x += 1

ot = f(2)
print(ot)
print(next(ot))
print(next(ot))
와 같은 함수를 만드는 것도 가능하다. 함수를 호출하고 나서도 함수가 완전히 끝나기 전까지는 지역 변수가 남아있으며, 함수가 끝나야 지역 변수가 삭제된다. 따라서 함수를 호출할 때마다 x의 값이 증가한다. 이렇게 만들어진 반복 가능한 객체는 \_\_next\_\_ 함수나 next(객체) 함수, 또는 for ... in 객체와 같은 문법들을 이용하여 순서대로 값을 호출할 수 있다. 특히 제너레이터의 경우, 미리 만들어놓는 게 아니라, 호출 될 때 반환값을 새로 만들어 반환하는 방식이기 때문에 메모리 관리 면에서도 이점이 있다.


4. 장점[편집]



4.1. 신속한 개발 속도[편집]



Python의 아이덴티티. 높은 생산성은 그 무엇과도 비교할 수 없는 Python만의 특징이다. 전 세계의 모든 프로그래밍 언어 중에서 Python 정도의 낮은 난이도를 가지면서, 오만가지 분야에서 생산된 훌륭한 패키지들을 통해 범용성까지 갖춘 프로그래밍 언어는 찾기 힘들다. Python으로 만든 프로그램을 같은 객체 지향 프로그래밍 언어인 JavaC++로 만드려는 순간 숨이 턱 막힐 정도.

인터프리터 언어이면서 우수한 자료형과 다양한 모듈 등을 제공해 개발 기간이 단축되는 것이 특징. Python이 막 유행을 타기 시작했을 때에는 'C언어로 2년 동안 완성하지 못한 프로젝트를 Python으로 한 달 만에 해냈다'는 극적인 경험담이 커뮤니티에 돌았을 정도다. 당장 Python의 집합 자료형 같은 경우 C언어로 구현하려고 하면 머리가 아파 온다. 아니 객체지향 언어랑 절차지향 언어랑 비교하니까 그렇지..

C언어와의 접착성도 좋기 때문에, 일단 Python으로 빨리 구현하고, 남은 시간에 속도에 병목이 되는 부분을 C++로 전환하는 전략을 내세우고 있다. 버전이 올라가면서 Python 자체도 그리 느리지 않게 되었다. 심지어 어셈블리어 같은 저수준 언어(Low level)도 Python에서 호출할 수 있다. Python은 어지간한 다른 프로그래밍 언어들을 지원하는 호환성 덕분에 응용할 곳이 무궁무진하다.실행 속도만 빼고

파이썬 출시 당시인 1991년에 개발 속도가 빠르다고 했는데 Traceback도 한몫한다. 이전에 유명와 인터프리터언어였던 perl 은 스택트레이스를 보여주지 않았기 때문이다. 반면 파이썬은 코드를 실수로 잘못 짠 곳이 있다면, 어떤 스택을 통해 어떤 어떤 파일의 어떤 줄에서 어떤 함수에서 어떤 종류의 문제가 발생했는지 자세하게 알려준다. 스택을 전부 보여주기 때문에 초보자에게는 당황스러울 수 있지만, 디버깅을 하다 보면 정말 편리하다. 아래는 오류(Exception) 발생 시의 터미널 출력 예시다. 파이썬 이후에 나온 인터프리터 언어들은 스택트레이스와 오류 줄을 표시한다.
Traceback (most recent call last):
  File "/path/to/example.py", line 4, in <module>
    greet('Chad')
  File "/path/to/example.py", line 2, in greet
    print('Hello, ' + someon)
NameError: name 'someon' is not defined


Python 가지고 스프레드시트데이터베이스까지 만드는 괴수들도 있다. Python으로 SQL을 구현하는 건 불가능하다는 소리가 있었지만 우리의 Nerd들은 해내고 말았다. 2013년 Python으로 관리하는 DB 개념이 잡힌 이후 수많은 피드백 끝에 2015년 도전 성공. 심지어 2017년 프랑스의 중견기업에서 Python DB 프로젝트를 보더니 정말로 회사의 DB를 Python으로 관리하는 사업을 벌려서 DB화되지 못하고 저장되던 회사 내부의 파일형 자료들과 기존의 DB에 저장된 자료를 접합시키는 사업까지 했다 한다.

빠른 아이디어 구현이 생명인 연구소에서 각광을 받고 있고, 인스타그램, 유튜브, reddit 등이 Python을 주로 쓰고 있다고 알려져 있으며, 외국의 구인 사이트에도 Python을 할 줄 아는 사람에 대한 수요가 많다. 컴퓨터 관련이 아닌 이공계 전반에서 많이 쓰이는 MATLAB은 오픈소스가 아니라는 점이 최근 추세와 맞지 않아 입지가 좁아지고 있다.[21] CG 업계에서도 사실상 표준으로 사용되는 스크립트 언어이다. MEL, MAXScript 등 프로그램별로 자체 스크립트 언어들이 난립하고 있었는데, 현재는 Python 스크립팅을 주력으로 밀고 있다. 또한 공대 졸업작품으로도 자주 쓰이는 프로그래밍 언어이기도 하다.

동적 타입 언어(Dynamically typed language)라는 점이 큰 프로젝트에서는 단점으로 작용하여 자료 구조 설계나 디버깅이 어렵다는 지적도 있다. 다만 "정적 타입 vs. 동적 타입" 논쟁은 서로의 장단점이 있다. 일례로 OCaml 같은 강력한 타입 인터페이스(Hindley-Milner, System F 등)를 가진 경우, 모든 타입 에러(!)를 컴파일 타임에 잡아낼 수 있는 반면에, 모든 버그가 타입 에러는 아니기 때문에 여전히 테스트 및 디버깅 과정은 필요하다, 반면에 동적 언어는 빠른 구현의 이점이 있지만 타입 에러가 많이 나는 특징이 있다. 한마디로, 컴파일 언어의 경우에는 컴파일 시간에 오류를 잡지만 동적언어는 놓치게 된다는 소리. Python으로 파서(Parser)를 많이 작성해 봤다면, 십중팔구 읽은 숫자를 string으로 저장했다가 나중에 연산을 했더니 연산이 불가능하다면서 에러가 나거나 이상한 결과가 나온 경험이 있을 것이다. Python 3.5부터는 타입 힌트를 이용해서 변수가 가질 수 있는 타입을 지정할 수 있게 되어 IDE 가 타입힌트를 해석해 타입오류를 쉽게 도움받을 수 있게 되었다.
그렇지만 실행중 체크를 하지는 않기때문에 여전히 주의 해야한다.

4.2. 피드백의 용이성[편집]


디자인 철학 자체가 가장 완벽한 하나의 아름다운 해답을 찾는 Python 특유의 철학을 찾다 보니, 문법 자체가 딱 떨어지게 표현된다. 이 때문에 다른 사람이 제안하고 만든 프로그램을 수많은 사람들이 보고 쉽게 접근할 수 있다. Perl 같은 경우는 Write Once, Read Never라고 불릴 정도로 피드백과는 담을 쌓았는데, Python은 문법이 통일되어 있다 보니 Write Once, Read Infinitely가 되어버렸다. 그래서 프로그램 하나 만들면 다른 프로그래머들에 의해 엄청난 양의 피드백이 들어오게 되었고, 이는 곧 생산성 향상으로도 이어졌다. 괜히 Python이 시간이 갈수록 점유율이 상승하는 언어가 아닌 것이다.


4.3. 과학 및 공학 친화성[편집]


Python은 과학과 공학 분야에서 필요한 여러 기능을 기본적으로 제공한다. 우선 언어 자체적으로 64비트를 넘어가는 매우 큰 정수를 지원한다.[22][23] 또한 허수를 기본적으로 지원하며, 표준 라이브러리의 decimal, fractions 모듈을 사용해 소수점과 유리수를 정밀하게 다룰 수 있다. 따라서 이러한 기능을 다루는 암호학과 통계 분야에서 쓰기에 알맞다.

Python 생태계 또한 공학 및 과학 분야를 빵빵하게 지원한다. 복잡한 수치와 큰 데이터를 다루는 연산에 알맞은 NumPy, SciPy, pandas, 데이터를 그래프로 시각화하는 Matplotlib, 코드와 데이터를 함께 다룰 수 있는 Jupyter Notebook 등의 강력한 패키지와 도구들을 무료로 사용할 수 있다. 이 점 때문에 막대한 라이센스 비용을 지불해야 하는 MATLAB은 이들에게 밀려 현재 교육용 정도로만 사용되고 현업에서는 거의 도태되고 말았다.

Python 개발자들도 이러한 사실을 잘 알고 있기 때문에 언어 차원에서 관련 패키지를 위한 기능을 제공한다. 가령 Ellipsis (
...
) 상수는 사실상 NumPy 전용의 슬라이스 객체로 제공한다.[24] 또한 3.5부터는 행렬곱을 위한
@
연산자가 추가되었다.


4.4. 거대한 생태계[편집]


Python으로 무언가를 하고 싶어지면 그걸 하기 위한 패키지는 인터넷 어딘가에는 존재한다. 사실상 못 하는 것이 없다.

웹사이트 서버를 구현하려고 하면 Python Web Framework를 쳐보자(Django, Flask 등). 기계학습 알고리즘을 쓰고 싶다면 python machine learning이라 검색하자(scikit-learn, TensorFlow, PyTorch). 얼굴 인식을 코드 몇 줄로 할 수도 있다(OpenCV). 기본적으로 설치되는 모듈인 tkinter 모듈을 이용하면 간단한 GUI 프로그래밍을 할 수 있다. 게임도 만들 수 있다(Pygame). 비주얼 노벨도 만들 수 있다.(렌파이) 수많은 VFX 프로그램들은 오래 전부터 Python을 스크립트 언어로 채택하고 있으며, 별도의 표준이 존재한다. 프로그래밍에 문외한인 사람도 잠깐만 배우면 엑셀 자동화, 파일 처리 자동화, 웹 크롤링 자동화, 3D 모델링 자동화와 같이 업무 시간을 단축해 주는 프로그램을 아주 쉽게 만들 수 있다. 물론 이 외에도 자동화하거나 만들 수 있는 것들은 끝없이 많다. 심지어 Kivy, Beeware 등의 크로스 플랫폼 앱 라이브러리도 있다. [25]

4.5. 교육의 편의성[편집]


Python은 위의 특징 때문에 교육용 프로그래밍 언어로 각광받고 있다. 현재 세계 유수의 대학교들은 프로그래밍 개론에서 쓰이는 언어를 C, C++나 Java에서 Python으로 바꾸었다.

주의할 점은 Python이 배우기 쉽다는 건 프로그래머 입장에서 나온 말이라는 것이다. 그마저도 다른 언어에 비해 비교적으로 쉽다는 뜻이지, 깊게 파고들어 가거나 특유의 'Python스러운'(pythonic) 코딩을 하려면 생각보다 신경 쓸 것도 많고 동적 언어에 익숙해져 있어야 한다.[26]
더욱이 컴파일러 없이 프로그래밍 하는 것은 깡초보에게 권장할 만한 것이 아닌게, 정적 언어에 대한 개념도 없이 동적 언어를 잡았다가는 오히려 더 헷갈릴 수 있다. 왜 마이크로소프트가 TypeScript를 만들었는지 잠시 생각해 보기 바란다. 더욱이 Python은 편집증이 의심될 정도로 객체 위주로 돌아가긴 하지만, 언어의 패러다임을 보면 절차 지향, 객체 지향, 함수형 모두 사용할 수 있는 언어다. 극단적으로 OOP를 지향하는 Java나 C#보다[27] 더 신경 써야 할 것이 많다는 이야기. 하여튼 프로그래밍 자체를 마냥 쉬운 것으로 생각하다면 큰코다친다. 프로그래밍을 쉽게 할 수 있는 것과 좋게 하는 것에는 큰 차이가 있으며, '좋은' 프로그래밍을 하는 것은 프로그래머의 '역량'에 크게 좌우된다.



5. 단점[편집]



5.1. 비교적 느린 실행 속도[편집]


우선 기본적으로 가장 아쉬운 점은 속도이다. 한 논문에 따르면, CLBG에서 제시한 10개의 벤치마킹을 돌려본 결과 Python은 C에 비해 71.90배의 시간, 2.80배의 메모리, 75.88배의 에너지를 더 소모한다고 한다.[28]

느린 속도를 보완하기 위해서 보통 여러 가지 방법이 동원된다. 기본적으로는 math나 random과 같은 Python의 내장 모듈을 사용해서 멀티쓰레딩이나 멀티프로세싱을 구현한다. 다만 Python은 글로벌 락 인터프리터(GLI) 문제로 애초에 멀티프로세싱에 효율적인 타입이 아니다. 즉 멀티 프로세싱을 해도 별로 나아지지 않을 수 있다는 얘기. 혹자는 Scipy나 Numpy와 같은 모듈의 고속 계산 함수를 별도로 개발해 쓰기도(Vectorize) 한다. 더 나아가서는 속도가 빠른 C와 같은 언어를 래핑(Wrapping)하여 작성하기도 한다. 전문적으로 개발할 때는 외부 패키지에 의존하지 않고 직접 작성한 코드에서 고속화를 하기 위해 자연스럽게 더 높은 난이도의 언어를 혼합해서 개발하게 된다. 이 경우 Python은 논리적인 부분을 담당하고, 래핑된 다른 언어는 코어를 담당하게 된다. 사실 전문적인 개발회사라면 이게 일반적이다. 대표적인 예시로 Numba나 Cython같은 제3자 솔루션을 이용하기도 하며, 흔히 인공지능 용도로 사용된다고 오해받는 Python TensorFlow 는 사실 C++ 이다. Python 을 이용해 TensorFlow 를 '호출도' 할 수 있을뿐이다, TensorFlow 의 로직을 수정 및 커스텀 하기 위해선 반드시 C++ 코드에 손을 대야 한다.

이처럼 Python은 사실 다른 언어에 비해 많이 느리기 때문에 프로그래밍 대회에서 실행시간 제한 때문에 어려움을 겪기도 한다. 시스템을 건드리거나 반복 연산이 많은 것은 하기 어렵지만 python numpy 처럼 따로 모듈을 지원하기 때문에 크게 걱정할 필요는 없다. 하지만 python numpy을 사용해도 느린 건 느리다. [29] 결국 Python은 첫 교육용 언어로는 몇달 좋으나 어느정도 튜토리얼을 벗어나려면 C언어를 이용해야 한다는 이야기. 아예 C언어부터 시작하는 것이 낫다는 관점도 존재한다.

GIL(Global Interpreter Lock)은 Python의 성능 저하를 얘기할 때 빼놓을 수 없다. Python은 멀티쓰레딩을 지원하기 위하여 GIL을 도입하여 사용하게 되었다. 따라서, python 쓰레드 10개를 만들어도 실제 Pthread/윈도우 쓰레드가 10개가 만들어지긴 하는데, GIL 때문에 개중 동시에 하나밖에 안 돌아가는 기이한 구조를 갖고 있다. 물론, 내부적으로 IO작업이 있을 시 바로 다른 쓰레드로 문맥 교환을 해주고, 바이트 코트를 100번 실행한 다음에는 인터프리터 차원에서 다른 쓰레드로 교체해 주므로 동시 작업 비슷한 효과가 난다. 이것은 구현이 매우 쉬워지고 빠른 개발을 할 수 있다는 장점이 있으나, 다중 코어 CPU가 보편화된 2006년 이후에는 다중 코어를 제대로 활용하지 못하는 구조적인 문제 때문에 HW를 이용하지 못한다는 평가를 받게 되었다. 만일 특정 프로그램에 순진하게 CPU 코어를 2개 이상 동원하려고 할 경우, 뮤텍스(MutEx), 즉 한 쓰레드에 여러 개의 CPU가 연산을 행하여 내부 정보를 오염 시키는 것을 방지하는 역할을 맡는 GIL이 병목 현상을 일으켜 코어 하나를 쓸 때보다 오히려 성능이 크게 저하된다는 것. 구글 내부에서 이미 가루가 되도록 까인 부분이다. 다만 GIL은 멀티프로세싱에서는 해당되지 않는 이야기다. 멀티프로세싱 모듈은 메모리를 완전히 분리해서 사용하기 때문이다.

일반적으로 기계어로 컴파일하여 사용하는 C, C++보다는 당연히 느리고, Lua, PHP. JavaScript, LISP 계열 언어 등 동적 언어들을 전체를 주욱 놓고 비교해 봐도 속도가 빠른 편은 아니다. Python처럼 가상 머신 위에서 실행되는 Java, JavaScript 등의 언어들의 경우, 속도 문제를 극복하기 위해서 JIT 컴파일러를 도입했다. Python의 사실상의 표준 구현체인 CPython은 JIT 컴파일을 도입하지 않았고, JIT 컴파일을 도입한 별도의 구현체인 PyPy가 등장했다. 통계 분야 등 특정 분야에서는 R과 같이 그 분야에 특화된 언어를 사용하는 것이 더 편리할 수도 있다.

더불어, 예전의 Python에는 CPU-bound한 쓰레드가 I/O-bound한 쓰레드와 함께 돌아갈 때, I/O-bound한 쓰레드가 실행되어야 할 상황에서도 context switch가 제대로 이루어지지 않는 문제가 있었다. 이 때문에 CPU-bound 쓰레드가 GIL을 지나치게 오래 점유하게 되면서 I/O 반응 속도가 느려지고, 다른 쓰레드는 GIL을 획득하려고 계속 시도하느라 CPU 시간을 낭비하게 되었다. 이에 대해 Python 전문가인 David Beazley가 2009년에 Mindblowing Python GIL이라는 강연에서 지적하였다.[30] 이후 Antoine Pitrou라는 개발자가 GIL을 뜯어고쳐 해당 문제를 해결하였고, Python 3.2부터는 새로운 GIL이 적용되어서 성능이 어느 정도 개선되었다.

단, CPU 부하가 큰 작업을 돌리는 것이 아니면 GIL을 체감하기는 생각보다 쉽지 않다. 다중 쓰레딩으로 CPU의 여러 코어를 최대한 이용하고 싶은 경우에는 GIL가 굉장히 아쉬운 이슈지만, CPU를 별로 쓰지 않거나 I/O가 주가 되는 작업은 유의미한 성능 차이가 없다. 게다가 어설프게 코어 몇 개 깔짝깔짝 이용해서 계산하는 것보다는 그냥 C언어로 모듈을 짜서 붙이는 게 더 빠르다. 즉, python에서 CPU를 많이 먹는 부분은 C 모듈을 짜서 붙이거나, 이미 C 모듈로 짜여있는 라이브러리를 사용하거나(Numpy, Scipy 등), 필요하다면 multiprocessing 모듈을 이용하여 멀티코어를 활용하는 편. 그 이상의 CPU 부하가 큰 작업은 처음부터 C, C++로 짜는 게 맞다.

하지만 대규모 연산의 멀티코어의 성능 향상을 보기 위한 것 말고도, I/O가 주가 되는 작업(즉, 여러 개의 I/O 이벤트를 기다리는 것)을 위해서 멀티쓰레드를 사용하는 경우가 많고,[31] 이런 경우에도 복잡한 동기화를 해야 하는 멀티쓰레딩을 사용하는 건 낭비이다. 왜냐하면 디버깅도 힘들 뿐만 아니라, 실제로는 I/O를 위해 기다리는 시간이 실제 I/O가 발생했을 때 필요한 처리 작업을 수행하는 시간보다 월등히 긴 경우가 많아 여러 개의 쓰레드를 관리하기 위한 자원만 낭비하는 꼴이기 때문이다.

따라서 GoErlang 같은 프로그래밍 언어들은 코루틴이란 개념을 도입해[32] 이러한 "event multiplexing"을 싱글쓰레드로도 구현할 수 있게 하고 있다. 특히 멀티쓰레딩할 때 필요한 각종 동기화 문제 없이 마치 싱글 쓰레드 코드를 짜는 것과 거의 동일한 방식으로 코드를 작성할 수 있으면서도 그러한 코드들이 "동시에" 동작하는 것처럼 실행해 주므로 프로그래머 입장에서 매우 편하다. 실제로는 각 이벤트에 필요한 처리를 하고 다음 이벤트가 발생하기 전까지 비는 시간에 다른 이벤트를 처리하는 코드를 실행시켜 주는 방식으로, 시분할과 비슷하지만 문맥 전환이 프로그래머가 작성한 코드에서 명시적으로 다음 이벤트를 기다려야 할 필요가 있을 때 협력적으로 발생한다는 차이점이 있다.

C 같은 언어에서 이러한 코루틴 지원이 잘 안 되는 이유는, 언어적 차원에서 함수 중간에 실행을 멈추고 다른 함수를 실행할 수 있게 해줘야 하는데 쓰레드 별로 stack이 1개밖에 없는 구조에서는 구현이 어렵고 하나의 함수로 짜야 할 내용을 여러 개의 callback 함수로 쪼개면 코드가 지저분해진다는 단점이 크기 때문이다. 이런 callback 형태를 사용하는 게 초기 Node.js 개발 환경이다. 위에서 기술한 Stackless Python에서 코루틴을 먼저 지원할 수 있었던 것도 이런 배경이 있다. 그나마 C++은 C++20에서 지원하기 시작했다.

다행히 Python은 (stackless가 아니더라도) yield 키워드를 통해 함수 실행 흐름을 제어할 수 있다. Python 3.4 버전부터는 표준 라이브러리의 각종 파일 입출력, subprocess, socket 통신 등의 기능들을 모두 코루틴화해 주는 asyncio 패키지가 기본 탑재되었다. Python 3.5 부터는 C##를 본딴 async 함수 선언자와 await 키워드가 포함되어 asyncio 라이브러리에 의존할 수밖에 없던 코루틴 기능을 다른 서드파티 라이브러리도 보다 쉽게 지원할 수 있도록 바뀌고, 코루틴 내부에서의 예외 처리 과정이 개선되었다큰

요새는 특정 경우를 제외하면 자동으로 GIL을 on/off시켜 주는 것으로 보인다.

이렇게 속도를 빠르게 하려고 별별 방법을 동원한다는 것과 이를 잘 아는 사람이 드물다는 것을 감안하면, Python의 최대 단점은 기본적으로 속도가 느리다는 것과 이를 개선하기가 어렵다는 것이라고 할 수 있겠다. 이로서 파생된 문제점으로 Python에 입문하는 것은 쉽지만 마스터하긴 어렵다는 문제점이 발생한다. 이는 프로그래밍 입문만 Python으로 하고 다른 언어를 주력으로 배우고 쓰는 것으로 해결될 수도 있지만,[33] Python은 C 패밀리와 이질적인 문법으로 인해[34] 다른 프로그래밍 언어를 배우는데 별 도움이 안된다는 새로운 문제가 생긴다.

당연하겠지만 Python 언어 자체를 구현하는 사람들도 느린 실행 속도가 Python의 최대 단점이라는 사실을 인식하고 있고 이를 개선하기 위해 다양한 방면에서 연구를 진행하고 있다. 후술할 PyPy와 같이 JIT컴파일을 하는 구현체를 만든 것도 그 결과물 중 하나이며, 최근에는 공식적이자 가장 호환성이 높은 CPython의 속도 또한 개선되고 있다. 2020년 Python 창시자 귀도 반 로섬은[35] 2021년 Python 회담(Python Language Summit)에서 버전 3.11에서는 속도를 2배 향상시키고, 향후 4년간은 속도를 5배 향상시키는 것이 목표라고 말했다. 실제로 2022년에 발표된 Python 3.11 버전에서는 상당한 속도 개선이 이루어진 것으로 보인다. 문제는 개선되었다고는 하지만 그래도 다른 프로그래밍 언어들과 비교하면 여전히 느리다는 것과 속도가 개선되는데 한계가 있다는 것이다. 이 때문에 미래에도 속도 개선이 지속적으로 이루어져야 쓸만한 속도가 나올 것으로 보인다.


5.2. 일반 사용자에게의 배포[편집]


Python은 프로그래머가 곧 자기가 만든 프로그램의 이용자를 가정하기 때문에(Python은 처음부터 교육용 언어로 주로 쓰였다.), 긴 역사에도 불구하고 일반 사용자에게 배포를 하는 과정이 덜 발달되어있고 복잡하다. 단순히 복잡하기만 하면 문제가 없는데, 원시적이고 간접적인데다가 파편화 되어있기까지하니 문제가 크다. 그나마 'Python 프로그래머'들에게 'Python 프로그래머'가 배포를 하는 방식은 몇 가지가 있으나, '순수한 사용자'에게 '(Python으로 만든)기능'을 전달하는 수단에 있어서는 다른 언어들에선 상상하기 어려울 정도로 원시적인 측면이 있다. 또한 패키지가 일반 사용자에게 배포되더라도 Python 코드는 리버스엔지니어링에 취약해 코드가 매우 쉽게 공개된다. 암호화를 하더라도 키 난수화를 무한반복하면 결국 코드는 뚫린다. C의 dll 컴파일 지원과는 명백히 대비되는 부분.[36]


'딱 6줄의 Python 코드로 컴퓨터 바탕화면이 뱅글뱅글 돌아가는 프로그램을 만들어 친구를 놀래키자!'....는 영상이다.

'단, 그보다 먼저 친구 컴퓨터를 꿰어차고 Python/코드 에디터를 설치한 다음 Python 패키지 인스톨러 pip과 시스템 제어 패키지와 기타 등등....을 다 깔아놓은 다음에!'가 전제되어 있다는 것만 빼면.


대부분의 언어는 '프로그래머'가 '프로그래머가 아닌 사람'을 위하여 프로그램을 만들고, 그것을 받은 사람은 개발 도구 없이도 실행할 수 있는 것이 당연시되어 있다. 따라서 '프로그램을 만드는 도구'와 '프로그램을 실행할 수 있는 조건'은 분리되어 있다. 집을 사는 사람이 집과 함께 집을 짓는 과정에 필요한 시멘트, 포크레인, 덤프트럭, 크레인을 함께 인수받아야만 집에 입주할 수 있는 게 아닌 것과 같다.

예를 들어, C/C++와 같은 시스템 레벨에 가까운 언어는 기본적으로 OS와 함께 해당 언어로 만든 프로그램을 실행할 수 있는 환경이 갖춰져 오거나, 추가 기능이 필요한 경우에는 OS 제작사 등이 책임을 지고 최대한 불편하지 않게 설치할 수 있도록 만들어 놓는다. 예를 들어 게임을 설치하는 중 'Visual C++ 20xx Redistributable'(vc_redist.exe) 설치 프로그램이 자동으로 인스톨러와 연동되는 등으로.

JavaC\#과 같은 '가상 실행 환경'을 통해 돌아가는 언어의 경우 해당 가상 환경이 얼마나 널리 보급되는지가 언어의 흥망을 좌우하는 매우 중요한 요소이므로, 해당 언어를 지원하는 단체나 기업에서 매우 공을 들여 최대한 쉽고 간단명료하게 설치할 수 있도록 최선을 다한다. Java의 경우 Java로 된 프로그램을 실행하기 위해서는 JRE[37]이라는, '자바 프로그램을 실행하기 위한 실행 환경'을 꼭 설치해 줘야 하지만, JRE는 깔끔하게 정돈된 공식 사이트에서 쉽게 다운받아서 다른 응용 프로그램 설치하듯이 '30억 개 장치에서 Java 사용'이라는 광고 문구를 보며 한 큐에 설치하는 것으로 모든 준비가 끝난다. 이마저도 JDK, JRE 등의 복잡한 구분 없이 그냥 Java를 설치한다고만 안내하는 등 설치를 까다롭거나 위협적으로 느끼기는커녕 지금 설치하는 게 정확히 JRE라는 점조차 몰라도 되도록 배려하고 있다. C#의 경우 마찬가지로 .Net 이라는 런타임 환경이 컴퓨터에 설치되어 있어야 하는데, .Net Framework나 .Net Core 같은 이름으로 쉽게 최신 버전 환경을 설치하여 사용할 수 있게 만들어 놓았으며 Microsoft Windows와 C#이 같은 Microsoft에서 개발되기 때문에 윈도우 신버전에는 당시 최신 버전의 .Net 환경이 기본적으로 내장되어서 나오고 업데이트조차도 윈도우 업데이트에 통합되어서 제공된다.[38] JavaScript 같은 경우엔 처음부터 엄청나게 강력한 가상 실행 환경 그 자체가 된 웹 브라우저를 위한 언어였기에 다른 어느 언어보다도 폭넓게 보급되고 간편하게 활용될 수 있었다. 아예 크로뮴 엔진을 통째로 가상 실행 환경으로 갖다 써서 데스크톱 응용 프로그램을 만드는 Electron 같은 물건도 있을 정도.

반면 Python은 기본적으로 'Python을 설치하고 개발 환경을 구성한 사람이' '자기 컴퓨터나 자기가 관리하는 시스템 속에서 돌릴 프로그램을' '직접 만들어 쓰는' 것을 최대의 목적으로 발달해 왔기 때문에 '프로그램을 만드는 환경'과 '프로그램을 돌리는 환경'이 사실상 구분되어 있지 않다. 이 때문에 'Python 프로그래밍 환경'은 존재하고 다운받아 설치할 수 있지만, '이걸 깔면 Python 프로그램을 돌릴 수 있습니다'라는 환경은 별도로 존재하지 않는다. 그래서 프로그래머들이 자신이 개발했던 환경을 '알아서 잘'포장해서 전달해 줘야 하고, 이것이 Python 프로그램 배포의 가장 기본적인 원리다. 메이저 버전별로 업데이트가 따로 되기 때문에 버전이 다르다면 따로 받아야 하는 건 덤이다(...)

이 말은 두 가지를 의미한다. 첫째, 다른 시스템에서 프로그램을 돌리기 위해서는 (정석적으로는) 만들 때 갖췄던 환경(Python 및 패키지)을 모두 다 똑같이 설치해 줘야 한다는 것. 둘째, 그 '환경'을 설치하는 과정은 기본적으로(정석적으로)는 일반인이 아닌 프로그래머가 쓰는 것을 전제로 만들어져 있다는 것.

실제로 Stackoverflow 같은 개발자 포럼에도 'Python 사용할 때는 좋은데 이걸로 만든 프로그램을 남에게 전달할 때는 어떻게 하죠?'라는 질문에 가장 흔한 반응이 '그까이 꺼 터미널 띄워서 Python 설치하고 pip 깔아서 패키지 잘 인스톨하라고 하세요. 쉽잖아요.'하는 식의, 전형적인 프로그래머 시각의 답변이 주를 이루고 있다.

그나마 이런 설치 과정을 자동화하려는 몇몇 시도가 py2exe, Pyinstaller, cx_Freeze와 같이 'Python 패키지 환경을 모조리 압축해서 exe로 포장해 줄게'라는 접근법이다. 당연하지만 Python 환경을 그대로 포장 이사하는 것이므로 파일 하나의 용량이 뻥튀기되기도 하고, Python 언어 자체를 개발/관리하는 주체와는 무관하게 제3자들이 추진한 솔루션이기 때문에 나중에 나올 패키지들과 잠재적으로 호환되지 않거나 개발이 중단될 수도 있다. 특히 용량이 생각보다 큰 문제인데, 실제로 단순하게 Python 패키지 몇 가지만 포함시켜 묶어 놓으면 일반적으로는 수백 MB부터 많게는 수 GB 단위까지 커지는 경우가 부지기수다. 대표적인 사례로, Hello, world!를 출력하는 프로그램의 경우 C언어를 이용해 exe파일을 만들면 약 0.25 MB에 불과하지만, Python과 Pyinstaller를 이용해 exe파일을 만들면 약 5.8 MB 용량의 파일이 만들어진다.[39]

물론 이러한 방식의 접근은 Java에서도 별도 설치형 JRE를 퇴출시키기 위해 버전 10 이후로 채택[40]한 것이기도 하지만, 그쪽은 자체적으로 jlink라는 표준화된 방식을 제공하는 반면 Python은 표준화된 방식 없이 여러 사람들이 제각기 자신의 방법으로 백가쟁명하고 있어 여러 종류의 패키징 도구가 난립하고 있다는 점이 문제다. 굳이 하나를 뽑자면 Pyinstaller라는 패키징 도구가 그나마 보편적으로 많이 사용되기는 하는데, 나름대로 단점도 있고 PyOxidizer 등 새롭고 좋은 패키징 도구도 많이 나오고 있어서 Pyinstaller를 표준이라고 부르기는 힘들다.

게다가, 개발자야 자기가 사용하는 Python 설치 환경 하나만 가지고 있으면 되지만, 이런 식으로 패키징된 프로그램을 비 프로그래머가 여러 개 사용해야 한다면 각각의 프로그램마다 제각기 '자신용' Python 환경이 통째로 딸려오게 된다. 비유하자면 고객이 패스트푸드 가게에서 치즈버거를 주문하면 치즈버거 전용 101호실에서 요리를 시작하고, 불고기버거를 주문하면 전기, 가스, 수도, 직원 등이 완전히 별도로 갖춰진 불고기버거 전담 102호실에서 불을 켜고 요리를 시작하는 식이다.

Python이 '입문하기 쉬운' 언어로 부상하고, 특히나 AI/수리과학/딥러닝 등에 많이 사용되면서 'Python 사용자'들 사이에서 프로그램을 교류하기 위한 궁리는 많이 진척되었다. 특히 Docker나 주피터 노트북 같은 솔루션은 '해당 환경을 갖추고 있는 사람에게는' 매우 쉽고 편하게 프로그램을 받아서 돌려볼 수 있는 도구이다. 그러나 역설적으로 '프로그래머가 되라고 권유하기 쉬운' 언어가 되어 가면서 '애초에 프로그래머가 아닌 사람을 위한 지원에는 관심이 거의 없는' 언어로 점차 발달하게 된 것이 아이러니하며 이러한 쉬운 교류 관점에 프로그래머적이 아니라며 비판을 가지는 사람들도 존재한다.

아이러니한 점은, Python이 프로그래머들에게 쓰기 편하기 때문에 Make등의 패키지/프로젝트 관리용 스크립트로도 많이 배포된다. 즉 Python 자체는 패키징 도구가 난잡한데, 정작 다른 프로그램을 패키징할 때는 Python이 유용한 도구로 많이 쓰인다는 것.


5.3. 점점 어려워지는 난이도[편집]


파이썬은 '입문하기 쉬운' 언어를 목표로 했지만 비슷한 다른 언어들이 그러하듯이 점점 사용 규모가 방대해지면서 난이도 곡선이 가파르게 올라가는 중이며 특히 위의 설치 문제나 난립하는 구현체들 간에서 발생하는 문제점 등이 겹쳐 더이상 마냥 "쉬운 언어"라고 하기에는 어려워진 상태다.

파이썬의 수많은 함정만 모아둔 깃허브 저장소도 있을 정도 #


6. 구현체 목록[편집]


파일:나무위키상세내용.png   자세한 내용은 Python/구현체 문서를 참고하십시오.


7. 개발 환경[편집]



7.1. 명령줄 인터페이스[편집]


영어로는 CLI(Command Line Interface)라고 한다.
  • 터미널
윈도우에서는 명령 프롬프트(cmd), 리눅스에서는 Bash, macOS에서는 터미널이라는 이름으로 들어 있다. 여기서도 간단한 코딩을 할 수 있고, 짧은 Python 코드가 잘 작동하는지 즉흥적으로 실험해 볼 수 있다.
  • IDLE
Python 기본 탑재 콘솔로, 순수 Python으로 작성되었다. 콘솔과 같이 직접 명령을 입력하는 것 외에도 Python 스크립트를 직접 편집할 수 있으며, 문법 강조와 디버깅 등의 기능을 지원한다. Python에 입문하는 경우에는 따로 텍스트 에디터를 설치할 필요 없이 IDLE만으로도 충분하다.


7.2. 통합 개발 환경[편집]


영어로는 IDE(Integrated Development Environment)라고 한다. 터미널, 디버거, 확장(Extension), 코드 편집기 등 개발에 도움울 주는 각종 기능들이 담겨 있는 앱을 가리킨다. IDE는 작업 중인 코드 상의 문제를 추적해 주거나 스타일 수정을 해 주는 패키지와의 연동을 통해 GUI 상에서 코드 퀄리티 관리를 자동으로 해 주는 편리한 기능도 제공한다.
놀랍게도 MS는 2017 버전부터 아예 파이썬 개발 환경을 VS에 통합했다. VS를 설치할때 파이썬 개발 기능을 활성화 할 경우 파이썬 3 컴파일러와 그외에 필요한 구성요소를 같이 설치할 수 있는데 VS자체가 나쁜 툴은 아니지만 너무 무겁다는 점 때문에 잘 쓰이지는 않고 대부분 코드 에디터인 VSC에 MS가 제공하는 Python 개발 확장을 설치해 IDE처럼 사용하는 경우가 대다수다.

JetBrains에서 개발한 IDE로, 코드 컴플리션 기능이 우수하고 Python의 장점인 각종 프레임워크 지원이 가장 뛰어나다. 커뮤니티 에디션은 무료이지만 Django 같은 개발에 실질적으로 도움이 되는 툴을 쓰려면 프로페셔널 에디션을 사용해야 한다.[41] 프로페셔널 에디션이 없더라도 플러그인 등을 통해 기본적인 html/javascript 문법 지원과 기본적인 자동 완성은 가능하지만, Django 전용 자동 완성(예를 들어 템플릿에서 Python 변수명을 자동 완성해 준다든지), 실시간 렌더링 및 디버깅 등의 기능 등은 전혀 사용할 수 없다. Visual Studio Code가 나오기 전까지는 IDE에서는 독보적인 제품이었으나 이젠 그렇지 않다.
  • 물론 VSC는 다양한 플러그인을 지원한다는 장점이 있지만, 모든 환경 세팅[42]을 개발자가 직접 해야 하기에[43] 설치만 하면 (거의 99%) 모든 게 다 준비되어 있는 JetBrains 사의 툴을 선호하는 사람들도 상당히 많다.[44] 패스트푸드점에 비유해서 쉽게 말하면 VS Code는 구성품목을 하나 하나 골라 까는 써브웨이고, JetBrains 시리즈는 스페셜 할인팩 하나 시키면 어지간히 배불러터질만큼 왕창 끼워주는 버거킹에 가깝다. 자기 입맛대로 사소한 것 하나하나 고르는 게 좋으면 VSCode가 맞고, 환경 까는건 재미없으니 적당히 치우고 빨리 코딩이나 하고싶은 사람은 JetBrains가 맞다.
  • Spyder (소스코드)
오픈 소스 IDE로 과거에는 PyCharm 프로페셔널 에디션 같은 IDE를 쓰기 힘든 사람이나 개인 개발자가 사용할 만한 IDE의 실질적인 대안으로 많이 사용되었는데 요즘은 VS Code라는 더 좋은 대안이 생겨서 Python 초보 학생들은 잘 쓰지 않는다. 아나콘다 패키지에 기본적으로 포함되기 때문에 아나콘다를 설치하면 자동으로 설치된다. 때문에 현재는 주로 머신러닝, 통계, 데이터 과학 관련 분야 등 수치를 계산하고 그 결과물을 그래프나 도표 등을 통해 시각적으로 바로 확인할 필요가 있는 경우에 많이 쓰인다.


7.3. 코드 편집기[편집]



개인 취향이나 프로젝트 성격에 따라 종합적인 IDE가 아닌 가볍고 빠른 코드 편집기를 더 선호하기도 한다. 개중에는 플러그인을 설치하여 IDE 못지않은 기능을 추가할 수 있는 경우도 있어서 비주얼 스튜디오 코드같은 툴은 2021년 기준 통계로 전 세계에서 가장 인기 있는 Python 개발 환경으로 자리잡고 있다.


7.4. 노트북 편집기[편집]


영어로는 Notebook이라고 부른다. 흔히 노트북이라고 불리는 랩탑 컴퓨터가 아니다

마치 블로그를 작성하듯이 코딩하는 특이한 개발 환경으로, 스타일 있는 문서 양식을 접목시킬 수 있다. 블로그를 쓰듯이 단락을 만들고, 그 안에 Cell을 만들어서 코드를 적어놓고, 실행시키면 Plot을 할 수 있다.

이런 것이 무슨 프로그래밍 도구인가 싶긴 하지만, 데이터 사이언스나 데이터 분석과 같은 분야는 완성된 시스템을 만들기보다, Python 코드로 데이터를 어떻게 처리하면 되는지 프로토타입을 만들고 그것을 가지고 리포트를 쓰거나 프리젠테이션을 하는 일이 많기 때문에 종종 사용한다. 즉 이들에게는 하나의 완성된 프로그램을 만드는 것이 아니라 데이터를 이리저리 돌려보며 코딩 → 결과 확인 → 코드 수정 → 결과 확인 등의 반복적인 작업이 중요하기 때문이다. SymPy, NumPy, SciPy, Matplotlib 같은 수학, 과학, 머신 러닝 라이브러리를 자주 이용하는 환경에서 개발할 때 유용한 편이며, pandas 등의 라이브러리를 사용하여 데이터 분석을 하는 데도 사용한다.

Notebook을 실행하는 컴퓨터에 엔비디아 그래픽 카드가 탑재되어 있을 경우 CUDA와의 결합으로 빠른 연산을 해내는 데 특히나 유용해진다.

공부하는 입장에서 스크립트 파일을 일일이 만들어야 하는 통상적인 개발 방식이 번거롭게 느껴진다면 차라리 Notebook을 이용해 각종 알고리즘을 공부해 보는 것이 좋다. 다만 소스 파일이 단순한 스크립트 파일이 아니라 거진 워드 문서 같은 수준이 되어 버리기 때문에 (Plot 같은 것을 바이너리 형태로 저장해야 하기 때문이다) 용량이 커지고 Git과 궁합이 맞지 않게 된다는 점은 단점이다. 또한 최소 백 줄이 넘어가는 프로젝트는 노트북으로 하면 안 된다. 노트북은 리포트를 쓰는 데에나 활용하고 진짜 개발은 Python 스크립트 파일을 작성해 하도록 하자.

  • IPython[45]
  • Jupyter Notebook[46]
  • JupyterLab[47]
  • Google Colaboratory[48]


7.5. 패키지 관리[편집]


  • PyPI
Python의 공식 패키지 저장소로, Python package index의 줄임말이다. 2012년 Python 소프트웨어 재단에 의해 구축되었다.[52] 2021년 11월 기준 34만여 개의 패키지를 제공한다.[53] 아래와 같이 Python 패키지를 간단히 설치할 수 있다. 기본적으로 패키지를 모두 한곳에 설치하기 때문에 시스템에 내장된 Python에 영향을 주며, 프로젝트를 여러 개 관리할 경우 호환성 문제가 생긴다. 따라서 virtualenv와 같이 가상 환경을 다루는 도구와 함께 사용하는 것이 좋다.

사설 패키지 저장소 겸 가상환경 관리 프로그램으로, 공학/과학 응용 분야에서 매우 널리 사용되며 일반 사용자에게는 무료이다. [54] `conda`라는 명령줄 프로그램을 제공하며, 이는 별도의 가상환경 생성 및 관리 기능을 가지고 있고 같은 명령어로 해당 가상환경에 패키지를 설치할 수 있다. Python 패키지만 지원하는 PyPI와 달리 blas, cuda, boost 등의 패키지 또한 등록되어 있어 anaconda에서 관리하는 가상환경에 설치할 수 있다.
편리하고 공식적인 PyPI를 사용하지 왜 굳이 이런 사설 패키지 저장소를 사용하냐고 궁금해할 수도 있는데, 이는 의존성(Dependency) 관리 때문이다. PyPI는 의존성 충족 여부를 단순히 패키지별로 확인하며, 두 패키지의 의존성이 충돌되는 경우를 막아주지 않는다. 그러나 conda의 경우 의존성 트리를 철저하게 확인하여 그러한 의존성 모순이 없도록 강제한다. 따라서 의존성 관계가 복잡한 경우 conda를 사용하여 관리하는 것이 편리하다.

또한 상술한 바와 같이 python 패키지 외의 다른 언어로 작성된 패키지도 설치가 가능하며[55], 이들 또한 위의 의존성 관리에 포함된다. 따라서 시스템에 설치되어 있는 패키지의 버전이 설치하고자 하는 라이브러리와 호환되지 않거나, 보안상의 이유로 시스템에 패키지를 추가 설치하기 어려운 경우 사용할 수 있다. [56] 이와 같은 이유로 의존성이 복잡한 몇몇 패키지들은 anaconda를 사용하여 설치하는 것을 권장하는 경우가 있다.
수학/과학/공학 업무에 필요한 NumPy, SciPy, Jupyter Notebook 등의 수백 개의 패키지와 도구를 한 번에 깔아줄 뿐만 아니라 GUI도 제공하는 Anaconda와, 코어 기능인 패키지 매니저 및 가상환경 관리자만을 제공하는 Miniconda가 있다. 다만 Anaconda는 설치에 시간이 오래 걸리고, 어차피 몇백 개나 되는 패키지를 다 쓸 일은 잘 없기 때문에 Conda 사용에 숙련되면 Miniconda를 쓰는 것도 좋다. Miniconda는 패키지를 자신이 직접 찾아서 깔아야 하지만, 어차피 필요한 패키지를 설치하는 것은 install <패키지명> 몇 번만 두드려 보면 간단히 해결된다.
각종 Python 라이브러리를 설치하고 관리하는 도구이다. 몇몇 Python 라이브러리는 리눅스의 패키지 관리자로도 설치할 수 있지만, 이는 시스템의 Python을 건드리므로 일반적으로는 권장되지 않는다. 쓸데없는 라이브러리들이 함께 설치되거나 패키지 의존 관계가 꼬이는 것을 막으려면 하나의 패키지 관리자만 이용하는 것이 좋다. 단, Conda에는 등록되지 않아서 PyPI으로만 설치할 수 있는 패키지는 어쩔 수 없이 PyPI을 사용해야 한다. 그리고 PyPI로 설치할 수 없는 시스템 의존성(Dependency)이 있으면 Conda로 설치해야 한다.

리눅스와 같이 자체적으로 Python을 탑재한 운영체제에서는 호환성 문제를 특히 신경 써야 한다. 시스템에 내장된 핵심 도구들이 기본적으로 설치된 Python 라이브러리를 사용하기 때문이다. 만약 패키지를 설치하다가 호환성 문제가 생기면 최악의 경우 OS를 재설치해야 할 수 있다. 따라서 이런 OS에서는 시스템 내장 Python에 패키지를 설치하면 안 되며, 대신 install --user로 사용자별 기본 환경에 설치하거나 별도의 가상 환경을 만들어야 한다.

이렇게 Python으로 개발한 SW를 공개 배포하는 경우 소스 코드가 그대로 노출된다. 사실 이 부분은 오픈소스 생태계에서 아주 유리하게 작용했는데, 누군가 만들다 중단된 프로젝트를 포크(Fork)해서 프로젝트를 이어가거나 기존 코드를 들여다보고서 그 패키지에 대한 확장 기능을 어렵지 않게 개발할 수 있었기 때문이다. 코드에 대한 버그 신고나 커밋, 피드백도 Python 생태계의 발전을 견인한 한 축이었다.

상용 프로그램을 개발하거나 보안을 유지해야 하는 경우 Python 코드를 숨기는 것이 불가능하지는 않다. 가장 쉬운 방법은 byte code인 pyc파일로 변환하는 방법이다. 하지만, 이 방법은 조금만 노력하면 디컴파일이 쉽게 되기 때문에 코드를 숨길 수 없고 다만 코드 보기를 조금 어렵게 만드는 것으로 이해해야 한다. Pyc 파일보다 나은 방법은 PyInstaller를 사용하는 방법이다. PyInstaller는 Py 파일을 종속성을 분석해서 필요한 shared lib를 하나에 폴더에 패키징하고, EXE나 ELF의 실행 파일을 생성하여 소스 코드를 숨길 수 있다. PyInstaller로 패키징하는 과정에서 --key 옵션을 사용하면 AES256 으로 Bytecode를 암호화한다. 다만 이는 Python 자체 기능이 아니라 제3자 솔루션이라는 한계가 있다.

7.6. 가상 환경[편집]


한 컴퓨터 내에서 여러가지 프로젝트를 작업할 때, 필요한 버전이 다른 경우 프로젝트가 꼬일 가능성이 있다. 예를 들어 다음과 같은 상황을 가정하자. 프로젝트
projA
에서는 모듈
mod
의 1.0 버전에 있는 함수
funcA
를 사용한다. 그런데
mod
가 2.0 버전으로 업데이트 되면서
funcA
가 사라지고 전혀 관련이 없는 함수
funcB
가 생겼다. 이 때 또다른 프로젝트
projB
에서
funcB
가 필요하다. 이런 상황에서,
mod
를 2.0으로 업데이트 하면
projA
를 실행할 수 없고, 업데이트를 하지 않으면
projB
를 실행할 수 없다. 이런 때를 위해 필요한 것이 바로 가상환경이다. 로컬에서 python을 사용할 땐 poetry + pyenv + pyenv-virtualenv를 일반적으로 사용하며 속도나 용량이 다른 방법보다 낫다.
VSCode 같은 일부 IDE에서는 가상환경이 감지될 경우 폴더 내의 해당 가상환경을 자동으로 잡아서 실행해준다. 경로는 사용자 마음대로 정할 수 있지만, 대부분의 경우 가상 환경 경로를 가상환경 설정 내장 모듈과 동일한 이름의
venv
경로로 설정한다. 이를 이용해서 GitHub Desktop 등의 git 관리 앱 중에는 Python 프로젝트의 .gitignore 파일에 자동으로 venv/ 를 추가해주는 앱도 있다.

Python 3.3부터 추가된 가상 환경 관리 내장 모듈이다. 내장이기에 Python만 설치하면
python -m venv <가상환경 경로>
라는 단 한 줄의 명령만으로 매우 간편하게 사용이 가능하다. 가상환경 설치 후
< 가상 환경 경로 >/bin/activate
을 실행하면 가상환경이 실행된다. 가상환경 실행 중
deactive
라는 명령으로 바로 가상환경을 종료할 수 있다.

  • virtualenv
Python 가상 환경 관리자로, 패키지를 마음대로 설치할 수 있는 가상 환경을 생성한다. 각 프로젝트마다 자신이 사용할 가상 환경을 만들어주면 프로젝트마다 필요한 패키지를 따로 설정해 주는 것이 가능하다.

  • conda
Anaconda나 Miniconda를 설치하면 사용할 수 있다.

7.7. 버전 관리 시스템[편집]


버전 관리 시스템은 프로젝트 폴더 내 파일들의 변경 사항을 추적하고 개발 방향에 따라 분기도 나눌 수 있게 해 준다.

2010년 이후 전 세계적으로 대세 중의 대세는 Git이라는 버전 관리 시스템이다.

Git을 활용한 클라우드 형태의 서비스가 많이 등장하게 되었다. 종류는 많지만 그중에서도 압도적인 점유율을 차지하고 있는 곳은 GitHub다. 제대로 코딩 작업을 해 보려면 일단 GitHub에 가입해서 회원 가입을 하고 저장소를 만든 다음 GitHub Desktop을 설치해서 본인의 컴퓨터로 해당 저장소를 Clone시키면 된다. 어떤 언어로 된 프로젝트를 진행하든 개발자들은 거의 다 GitHub를 사용한다고 보면 된다. 그만큼 타 사이트에 비해 기능이 압도적이다.

8. 주요 패키지[편집]


패키지, 라이브러리, 프레임워크. 사실 이 3가지 용어는 혼용되어 사용되는 측면이 있다. 굳이 구분을 해 보자면, 패키지는 여러 개의 모듈을 모아놓은 것이고 라이브러리는 여러 개의 패키지를 모아놓은 것이라고 보면 되지만, 사실 이 또한 모호하기는 하다. 프레임워크는 라이브러리와 달리 흐름의 제어를 사용자가 아닌 해당 프레임워크 내부에서 알아서 처리하는 것이라고 한다.

Python 그 자체로는 매우 깔끔한 언어지만 제3자 패키지들은 사용법 측면에서 Python의 기본 철학에서 조금씩 벗어나는 경우도 있다. 그래서 Python을 접하고 배우다가 이런 패키지들을 처음 활용하게 될 때에는 여기저기서 턱턱 막히게 될 수도 있다. 다만 그것도 Python 생태계의 패러다임을 알게 되면 그런가 보다 하면서 이해하며 쓰게 된다.

개발이 중단된 몇몇 오래된 패키지들은 현재의 패키지 설치 시스템을 아예 지원하지 않거나 다른 패키지와 충돌하는 경우도 가끔 있다. 이럴 땐 어차피 설치가 안 되니까, 그냥 같은 일을 해 주는 다른 패키지를 찾아보는 게 낫다.

8.1. 코드 퀄리티 관리[편집]


  • Black: PSF(Python 소프트웨어 재단)에서 직접 만든 코드 스타일 수정 도구다. 다른 스타일 도구에 비해 매우 엄격한 것이 특징으로, 타협하지 않는 스타일 정리기(The Uncompromising Code Formatter)라는 컨셉을 고수한다. 이 때문에 다른 검사 도구에 비해 설정할 수 있는 옵션의 개수가 매우 적다. 내가 원하는 코드 스타일이 아니라 Black이 강요하는 스타일을 따라가야 한다는 단점이 있지만, 대신 Black으로 처리한 코드는 누가 쓰든 비슷비슷해서 가독성은 매우 뛰어나게 된다. 개발자가 신경 써야 할 것을 최소화한다는 점 덕분에 후발 주자임에도 빠르게 인기를 얻었다. 어떤 식으로 코드를 자동으로 수정하는지는 여기에서 체험해 볼 수 있다.
  • Flake8: 속도가 아주 빠르다. 그리고 플러그인을 더 설치해서 원하는 검사 방식을 추가할 수도 있다. PyPI에 관련 플러그인은 100가지도 넘게 있다. 그 중 선별된 목록도 있다.
  • Pylint: Python 코드를 검사하여 오류나 바람직하지 않은 문법을 잡아내는 도구이다.
  • MyPy: Python을 위한 자료형 검사 도구의 원조로, 순수 Python으로 작성되었다.
  • Pyre: 메타에서 만든 자료형 검사 도구로, Ocaml로 작성되었다.
  • Pyright: 마이크로소프트에서 개발한 자료형 검사 도구로, TypeScript로 작성되었다. Visual Studio Code 플러그인을 정식 지원하며, 플러그인이 아닌 명령줄 도구로 사용하려면 Node.js를 설치해야 한다.
  • Pytype: 구글에서 만든 자료형 검사 도구이다.
  • autopep8: Python 공식 스타일 가이드인 PEP 8에 맞게 코드를 고쳐준다.
  • yapf: 구글에서 개발한 스타일 검사 도구.
  • isort: import 문을 일관성 있게 정렬해 준다.

내가 작성한 Python 코드가 잘 쓰였는지 검사하거나 수정해 주는 패키지. Python은 다른 언어에 비해 문법 규칙이 일관적이지만, 한 줄의 길이나 문자열을 감싸는 따옴표(
""
/
''
) 등 개발자 입장에서 논쟁거리가 될 만한 요소는 많다. 따라서 코딩 스타일을 통일하는 도구를 사용하면 여러 사람이 협업하면서 생기는 코드의 가독성 문제를 개선할 수 있다. 또한 코딩하는 중에도 오류나 바람직하지 않은 코드를 잡아낼 수 있는 편리한 기능을 제공하는 도구를 사용하면 버그를 일찍 잡아내고 테스트에 드는 노력을 줄일 수 있다.

코드 검사 도구의 한 갈래로 자료형 검사 도구(type checker)가 있다. 동적 언어라서 변수의 자료형을 따로 체크하지 않는 Python을 위해, 코드를 직접 분석하여 변수를 올바른 용도로 사용하는지, 특정 함수에 올바른 값을 전달하는지와 같은 정보를 검사한다. 동적 언어인 JavaScript에 자료형을 추가하여 만든 정적언어인 TypeScript는 컴파일 중에 타입을 전부 검사한다. TypeScript와 달리 Python은 type hint가 있지만 코드에 있을뿐이지 Python 자체는 자료형을 검사하지는 않는다. [57]

이 중 유명한 패키지들은 설치하고 나면 Visual Studio Code나 PyCharm과 같은 편집기에서 아예 GUI와의 연동을 통해 눈으로 코드의 상황을 볼 수 있도록 표시해 주는 기능을 사용할 수 있다. 이는 해당 편집기들이 코드 퀄리티 관리 도구 API를 자체 기능와 연결시켜 놓았기 때문에 가능한 것이다.

8.2. 수학[편집]


범용성을 지닌 수학 라이브러리들
  • 넘파이(NumPy): 통계, 선형 대수, 행렬 계산, 금융 운용 등을 포함한 과학 계산과 수학 작업. 수치 해석, 특히 선형 대수(linear algebra) 계산 기능을 제공하며 자료형이 고정된 다차원 배열 클래스(n-dimensional array)와 벡터화 연산(vectorized operation)을 지원한다. 참고로 Numpy는 C언어로 제작되어, Python답지 않은 넘사벽 수준의 속도를 자랑한다. 꼭 수치 해석/선형대수 목적이 아니더라도 배열 형태의 데이터에 대한 처리 속도를 간단하게 높이는 용도로 사용할 수 있다.
  • 싸이파이(SciPy): 고성능 선형대수, 함수 최적화, 신호 처리, 특수한 수학 함수와 통계 분포 등 과학 계산용 함수를 모아놓은 Python 패키지이다. 고급 수학 함수, 수치적 미적분, 미분 방정식 계산, 최적화, 신호 처리 등을 위한 다양한 과학 기술 계산 기능이 제공된다.
  • 심파이(SymPy): 수치적인 계산이 아니라 기호(symbol)를 이용하는 대수적 연산에 사용되는 라이브러리이다. 인수 분해, 미분, 적분 등 다양한 기능을 제공하며, 단순한 계산이 아니라 수식을 직접 다뤄야 하는 경우 사용하기 편리하다. (ex. 특정 수식의 미분 결과를 알고 싶은 경우)
  • einops: 물리에서 많이 쓰이는 einstein summation convention을 사용해 다차원 배열을 조작하는 함수를 제공한다. numpy의 einsum 함수와 비슷하나, reduce와 rearrange 계열 조작에 특화된 패키지.
  • 넘바(Numba): LLVM을 이용한 Just-in-time (JIT)을 통해 수치 알고리즘을 가속화한다. 또한 CPUGPU[58] 병렬 연산을 지원한다.

8.3. 데이터베이스[편집]


데이터베이스 접근 관련 라이브러리
  • sqlite : SQLite 데이터베이스에 접근하기 위한 라이브러리
  • pymongo : MongoDB에 접근하기 위한 라이브러리
  • SQLAlchemy : 널리 쓰이는 파이썬 SQL 툴킷이자 ORM(Object Relational Mapper)이다.


8.4. 데이터 처리 및 통계분석[편집]


빅 데이터, 통계학 라이브러리.
  • 팬더스(pandas): 데이터 처리와 분석을 위한 라이브러리이다. 테이블 형태의 데이터를 다루기 위한 데이터프레임(DataFrame) 자료형을 제공한다. R의 data.frame을 본떠서 설계한 DataFrame이라는 데이터 구조를 기반으로 만들어졌다. Visualizing Pandas' Pivoting and Reshaping Functions 참조.
  • 다스크(Dask) : 홈페이지 판다스의 병렬 & 분산 처리 버전. 판다스랑 사용법이 거의 같으면서도 드라마틱하게 빨라진다. Lazy evaluation을 지원. 다만 아직 갈 길이 먼 것이 흠.
  • StatsModels: 통계회귀 분석, 시계열 분석을 위한 라이브러리이다.


8.5. 그래프 그리기[편집]


수학이나 데이터의 시각화를 전문적으로 하는 라이브러리
  • 맷플롯립(matplotlib): 과학 계산용 그래프 라이브러리. Tkinter, wxPython, Qt, GTK+ 등의 그래픽 엔진을 사용할 수 있으며 그래프와 차트 등을 그리기 위한 시각화 기능을 제공한다. API가 상당히 복잡하고 기본 스타일이 예쁘지 않다는 단점이 있으나, 매우 다양한 기능을 제공하며 커스터마이징이 제일 자유롭다는 장점이 있다. 실제로 논문 등 학술적 문헌에 자주 사용된다. pylab이라는 서브패키지를 제공하여 MATLAB의 그래프 기능을 거의 동일하게 사용할 수 있다.
  • 씨본(Seaborn): matplotlib에서 지원하지 않는 고급 통계 차트를 그리기 위한 통계용 시각화 기능을 제공하는 시각화 라이브러리이다.
  • PyQtGraph: 단순한 그래프를 그릴 수 있게 해 준다. 이름 그대로 PyQt의 위젯 형태이기 때문에 PyQt가 같이 필요하다. 그릴 수 있는 그래프 종류가 다양하지는 않지만, 다른 패키지와는 달리 마우스 조작으로 그래프를 실시간으로 이리저리 볼 수 있는 속도가 특징이다.
  • 보케#python(Bokeh): javascript 기반으로 html 그래프 및 차트를 그릴 수 있는 시각화 라이브러리로, 주피터 노트북이나 웹상에서 인터랙티브하게 그래프를 보여줄 수 있다. 심지어 간단한 위젯과 함께 웹 앱을 제작할 수도 있다.
  • Plotly: bokeh와 비슷하게 반응형 html을 생성하는 라이브러리로, 동명의 js 라이브러리의 python 인터페이스이다.
  • Pygal: 시각화 라이브러리이다.


8.6. 머신 러닝[편집]


머신 러닝, 딥 러닝의 경우 구현 로직이 복잡하고 유연한 개발이 필요하여 프로그래밍 전공자가 아닌 공학/과학자들이 사용하기 쉬운 라이브러리가 필요하였다. 이러한 요구조건에 딱 맞는 python 언어용으로 개발된 패키지가 주류를 차지하고 있다.
물론 순수한 python 코드는 성능이 바닥을 찍으므로 성능이 중요한 연산 파트는 C, C++ 등으로 작성되어 있다.

  • 사이킷런(scikit-learn): Python의 머신 러닝 라이브러리이다. 딥러닝보다는 데이터 전처리 및 classical machine learning 알고리즘 (SVM, decision tree 알고리즘 등)을 매우 편리하고 일관성 있는 API로 이용할 수 있다.
  • TensorFlow: 구글에서 오픈 소스로 공개한 기계 학습, 인공 신경망 라이브러리이다. 자세한 것은 해당 문서 참고.
  • 파이토치( PyTorch): 토치 기반의 기계 학습 라이브러리. 간결하고 구현과 성능이 빠르며 pythonic 한 코드 작성이 가능하여 TensorFlow보다 사용자가 익히기 훨씬 쉽다. 학계에서는 2017년부터 이미 파이토치가 텐서플로보다 더 많이 언급되고 있다.
  • 케라스(Keras): TensorFlow, Theano, CNTK 등 딥 러닝 라이브러리를 백엔드로 사용할 수 있어 쉽게 다층 퍼셉트론 신경망 모델, 컨볼루션 신경망 모델, 순환 신경망 모델, 조합 모델 등을 구성할 수 있다. TensorFlow 등 다른 라이브러리에 비해 쉬운 문법이 특징. 현재는 TensorFlow2와 통합되었다.
  • Jax: 구글에서 만든 다차원 배열 가속 라이브러리로, XLA(가속 선형대수) 컴파일러를 이용해 코드를 just-in-time 컴파일하는 기능 및 vectorize map과 같은 함수 transformation 기능을 제공한다. 머신 러닝 자체는 구현되어 있지 않으나, 머신 러닝 모델의 연산 백엔드로 많이 사용되므로 여기에 기술.


8.7. 그래픽 사용자 인터페이스(GUI)[편집]


운영체제 종류에 구애받지 않는 GUI를 개발할 수도 있다. 물론 데스크탑 한정이다.

  • Tkinter[59]
  • PyQt
  • PySide[60]
  • wxPython
  • PyGTK
  • SFML
  • pyglet

2021년 기준 실질적으로 Tkinter와 PyQt가 가장 많이 쓰인다. TKinter은 Python에 기본 내장되어 있으며 짧은 코드로도 원하는 걸 만들 수 있는 대신 단순하고, PyQt는 비교적 코드가 길지만 그만큼 세부적인 설정이 가능하며 Qt Designer이라는 앱으로 위젯을 이리저리 옮겨 창을 만들 수 있다.

PyQt와 PySide는 둘 다 Qt라는 크로스플랫폼 GUI를 만드는 방법을 개발하기 위한 별도의 프로젝트에 기반을 두고 있다. 이 중 Qt에서 공식적으로 지원하는 것은 PySide 쪽이며 라이센스도 LGPL로 GPL인 PyQt보다 사용에 있어 조금 더 자유롭다.

8.8. 웹 서버[편집]


Python은 웹 서버[61]와 웹 어플리케이션(프레임워크) 간의 호환을 위해 크게 두 가지 규격을 제시하고 있다. 하나는 Java의 서블릿을 모방한 WSGI[62]이고, 다른 하나는 비동기형(async/await) 프로그래밍을 위해 만들어진 ASGI이다. 웹 프레임워크와 웹 서버를 선택할 땐 서로 호환이 되는지 확인해야 한다. 이 외에도 자체적으로 웹 서버를 제공하거나 독자적인 규격을 사용하는 프레임워크도 있다.

Python 서버의 프로토타이핑에만 주목하여 토이프로젝트에나 적합하고, 실제 서비스엔 쓰이지 않는다는 편견이 있지만 그렇지는 않다. Python이 다른 언어보다 상대적으로 느리긴해도 진짜 병목이 되는 DB I/O가 훨씬 더 크기 때문이다. 실제로 인스타그램, 요기요 등은 아래 소개된 장고를 기반으로 개발되었으며[63], 스타트업 뿐만 아니라 거대 IT 기업에서도 일부 서비스를 Python으로 구현하는 경우가 늘고 있다. 물론, Python 서버는 충분히 Trade-off가 고려된 상태에서 최선의 구조로 제작된 '좋은' 코드를 사용할 때 유용한 것이지 무턱대고 프로토타입 수준의 하룻밤 코드를 적용해도 괜찮다는 말은 아니다. 단적인 예로, 넥슨의 듀랑고의 서버에는 게임 시스템이 가진 복잡한 데이터 추상화를 표현하기 위해 Python으로 디자인한 알고리즘이 다량 사용되었는데, 동시 접속자 수가 크고 즉시반응성이 매우 높아야 하는 게임 서버의 특성상 Python 서버를 스케일업하는 데 매우 장벽이 되었다는 후문이다. 최근에는 컨테이너 기반 Scale-Out과 MSA가 보편화되어 있으므로 일부 루틴의 퍼포먼스는 실용적으로 극복 가능하다.

uvloop와 같은 몇몇 핵심 컴포넌트는 C/C++ 등으로 구현되어있기 때문에, 경우에 따라서는 자바 등으로 구성된 서버만큼 좋은 퍼포먼스를 보이기도 한다.

아래는 WSGI 기반(동기형) 패키지들이다.
  • Django: 풀 스택 웹 프레임워크. 정식으로 비동기 프로그래밍이 가능한 것은 아니지만 ASGI 서버와도 부분적으로 호환이 된다.
  • Flask: 마이크로 웹 프레임워크. 가볍고 간단한 서비스를 만들기 좋으나, 복잡한 기능은 모두 플러그인을 설치해야 한다.
  • Bottlepy

아래는 ASGI 기반(비동기형) 패키지들이다.
  • Uvicorn
  • Starlette
  • FastAPI: Starlette에 데이터 검사 라이브러리인 Pydantic을 얹은 프레임워크로, API 서버를 빠르게 개발하는 데 알맞다.


8.9. 확장 모듈[편집]


영어로는 Extension Module이라고 한다. 확장 모듈은 C언어를 통해 Python의 실행 속도를 극적으로 향상시킬 수 있는 방법을 제공해 준다. CPython API (Python.h)를 통해 C로 작성되므로 CPython 구현체에 의존하는데, CPython은 C로 작성된 확장 모듈을 통해 Python에 내장된 함수나 객체처럼 사용할 수 있는 기능을 제공하기 때문이다. 구체적인 방법은 공식 문서에 나와 있다.

확장 모듈을 직접 작성하기 위해서는 C언어와 CPython API에 대한 상당한 지식이 요구된다. 그 예시가 궁굼하다면 numpy의 다차원 배열 소스 코드를 참고하자. 확장 모듈을 더 편하게 작성하기 위해서 아래에 서술된 패키지들을 사용할 수 있다.

다만 단순히 C로 작성된 라이브러리를 사용하는 것이 목적이라면 PyPy에서도 사용이 가능하고 호환성이 좋은 FFI를 사용하는 것이 더 바람직하다.

  • Cython: 싸이썬이라고 읽는다. 기존 Python 코드와 비슷한 문법으로 컴파일 과정을 통해 빠르게 실행할 수 있는 CPython용 확장 모듈을 제작하기 위한 패키지다. CPython의 속도를 높이고자 아예 C언어로 변환하여 컴파일하는 방법을 사용한다. Python의 문법을 확장하여 정적 타입 선언 기능을 넣어, 기존의 C 코드를 쉽게 접착할 수 있도록 만들었다. CPython C API를 이용하여 C 코드를 직접 접착하는 기존의 방식보다 훨씬 사용하기 쉽고, C언어로 변환되어 컴파일된다는 점 때문에 ctypes의 오버헤드 없이 C와 호환되는 라이브러리를 직접 사용할 수 있다. [64] 이것을 제대로 사용하면 적게는 열 배 정도에서 많게는 천 배 이상까지 속도 향상(C의 속도)을 경험할 수 있다. Cython은 이미 작성된 Python 코드를 재활용하기 위한 목적이 아니라 C/C++로 작성된 코드를 사용하기 위함이며 기존 Python 코드를 그대로 사용할 경우 컴파일은 되지만 유의미한 성능 향상을 얻을 수 없다. C언어 코드를 Python 코드 사이에 섞어 넣을 수 있을 정도의 C언어에 대한 지식이 필요하다. 대표적으로 사용된 예시로는 비동기 이벤트 루프인 uvloop가 있다. 본인이 쓴 코드를 다른 사람들이 읽을 수 없게 하는 난독화(Obfuscation)에 이용되기도 한다.
  • pybind11
  • Numba

8.10. 외부 함수 인터페이스(FFI)[편집]


Python에서 C언어와 같은 다른 언어로 작성된 함수를 호출할 수 있도록 한다. 영어로는 FFI(Foreign function interface)다.

하는 일은 CPython의 확장 모듈과 비슷하지만 완전히 다른 개념으로 몇 가지의 차이점들이 존재한다.
  • 확장 모듈은 Python의 API와 자료형을 사용하고 FFI는 C의 자료형을 사용한다. 예를 들어 list의 모든 요소를 더하는 함수를 작성한 다면 확장 모듈 에서는 list 객체를 그대로 C로 보내어 CPython의 타입(PyListObject*)과 CPython API의 함수(PyList_GetItem)을 통해 list의 요소에 접근한다면 FFI에서는 Python에서 C배열을 할당하여 데이터를 복사한 후 C로 포인터를 전달한다.
  • 확장 모듈은 별도의 컴파일이 필요하고 FFI는 C 라이브러리를 날것 그대로 사용할 수 있다.
  • 확장 모듈은 Python 구현체에 독립적이고 FFI 코드는 다른 구현체(PyPy)에서도 사용할 수 있다.

FFI를 이용하여 C함수를 그대로 노출하는 것은 프로그램을 매우 난잡하게 만들 수 있으므로 C타입으로 형변환을 수행하는 Wrapper function이나 C의 포인터를 가지고 있는 Wrapper class를 작성하여 Pythonic한 코드를 작성하는 것이 중요하다.

아래는 FFI 라이브러리이다.
  • ctypes: Python 내장 모듈이다.
  • cffi: Python 파일 안에 C 선언 그대로 을 사용하는 혁명적인 방식을 제공하는 라이브러리이다. [65]
  • PyO3: Rust용 FFI이다.



8.11. 기타[편집]


  • 뷰티풀 수프(Beautiful Soup): XML, HTML와 같은 구문 트리 또는 구조화된 데이터 처리를 위한 라이브러리이다.
  • dateutil: 복잡한 날짜 및 시간 형식을 다루는 라이브러리이다. 표준 라이브러리에 포함된 datetime만으로 해결하기 어려운 날짜/시간 문자열 처리나 국제 시간에 관련된 기능을 제공한다.
  • 셀레니움(Selenium): 웹 페이지 조작과 크롤링
  • 필로우(Pillow): PIL은 개발이 예전에 중지되었고, PIL의 포크(fork)인 Pillow가 그 역할을 대신하고 있다. Pillow를 쓰자. PIL은 Python Imaging Library의 머릿글자로 간편한 이미지 처리를 위한 라이브러리이다.
  • PyYAML: YAML 형식의 파일을 읽고 쓰기 위해 사용하는 라이브러리이다.
  • requests: HTTP 요청을 보낼 때 사용하는 라이브러리이다. 표준 라이브러리에 내장된 urllib 모듈에 비해 사용이 편리하고 기능이 뛰어나다.
  • tossi: 야생의 땅: 듀랑고를 개발한 왓 스튜디오에서 개발한 한국어 조사 처리 라이브러리. 같은 인물이 만든 korean 모듈을 대체했다.
  • argparser 터미널에서 명령어 parser 지원
  • Pygame - Python으로 비디오 게임을 제작하기 위한 프레임워크이다.
  • 스크래피(Scrapy): 웹 스크래핑 및 크롤링

9. 문법[편집]


파일:나무위키상세내용.png   자세한 내용은 Python/문법 문서를 참고하십시오.


10. 학습[편집]


유튜브, 온라인 책, 도서, 코딩 공부 앱 중 본인에게 가장 쉬운 방법을 택하는 것이 좋은 학습의 첫걸음이 될 것이다.
책의 경우 온라인으로 볼 수 있는 책은 링크를 첨부하는 것을 원칙으로 한다.
다음은 유튜브, 온라인 책, 도서, 코딩 공부 앱에 대한 설명을 차례대로 첨부하였다.


10.1. 유튜브[편집]


초보자를 대상으로 한 강의는 370만 이상의 조회수를 기록할 만큼 매우 인기가 좋다. 채널 자체가 Python을 타겟으로 다방면인 사용법을 다루기도 하지만, 초보자를 위한 강의도 존재한다. 썸네일을 다소 자극적으로 하는 점이 특징(?)이다.
Python을 활용한 웹 서버 개발을 설명한다. 특유의 깔끔하고 비유적인 설명이 초보자에게 좋다. 다만 애초에 채널 자체가 웹 개발을 위주로 설명하는 곳이기 때문에, Python을 이용한 웹 개발만 배울 수 있지 다른 분야에 대한 설명은 없다.
점프 투 Python 교재를 활용한 강의를 진행한다.
혼자 공부하는 Python 교재의 무료 강의를 공개했다. 딕션과 말의 빠르기, 책에서 다루지 못한 내용들, 다른 방식으로 했을 경우의 문제점까지 사소한 것부터 대략적인 흐름을 다시 짚어주는 등 강의 퀄리티가 꽤 좋다.

10.2. 위키독스[편집]


실제 책과 동등한 수준의 내용을 온라인으로 편하게 배울 수 있다.
서적으로 있는 그 책 맞다. 온라인 책이 오프라인 책으로 실제 출판된 케이스다. 시작이 온라인이라 그런지, 질의응답을 잘 해주기로 알려져 있다.
이름 그대로 Python의 기본기를 설명해 준다.
한국 국내에서 주식 투자를 하는 사람 중에서 이른바 알고리즘 트레이딩, 쉽게말해 개인판 프로그램 매매[66]를 짜려는 사람도 있다. 한국 개미투자자들이 주로 사용하는 키움증권, 미래에셋대우, 이베스트투자증권, 대신증권 API를 활용해, 간단한 프로그램을 짜서 프로그램 매매를 할 수 있기 때문이다. 다만 원래 Python 속도가 느려서 원래 알고리즘 트레이딩(개인 프로그램 매매)는 Python보다 속도가 빠른 R이나 C언어로 하는게 원칙이다. 미국 금융업계에서는 R로 하는 프로그램 매매를 가르친다.[67] 그런데 한국에서는 주식 투자자들 보고 Python 외에 R이나 C언어까지 배우라고 하기는 어렵다고 생각했는지, Python 알고리즘 트레이딩 책이 나왔다. 해당 위키독스는 2017년 출판된 이후 인기를 끌어서 2019년 개정판이 나오기도 했다.
마치 문제집 같은 형식으로 직접 풀면서 연습해 보기 좋다.

10.3. 도서[편집]


Python 관련 도서 중에선 2023년 현재까지도 이거다! 할 만한 명저가 없다. 프로그래밍 입문부터 실사용까지 오만 가지 책들이 난립해 있어서 핵심을 관통하는 주제를 딱히 잡기 어려워서인 듯하다. Python 관련 책은 대형 서점에 가면 Python 분류가 따로 잡혀서 어마어마하게 난립해 있을 정도로 경쟁이 치열하다. Python만 따로 분류가 잡혀서 매대를 꽉 채운 Python 책들을 보다 보면 춘추전국시대 저리가라 할 수준이다. 그러나 도서들이 죄다 특정 분야에만 치중해서 전반적인 내용을 관통한 책은 별로 없는 것은 문제다. Ruby 같은 경우는 기타 프로그래밍 언어에 Programming Ruby 딱 한 권만 달아놔도 재고가 없을 정도로 인기인 것과 정반대. Python은 책이 워낙 많다 보니 서점에도 재고가 수두룩하다. 이렇게 Python 관련 책은 선택지가 많으니 인터넷에서 잘 비교해 보고 고르기를 추천.

Python 입문을 벗어나고 나면, 기계학습 분야로 갈 것이냐, 빅데이터 분야로 갈 것이냐에 따라서 추천 도서가 달라진다. 생활코딩에서도 이거 때문에 관련 문의가 페이스북 페이지에 올라오는 편이다. 빅데이터 분야(데이터 분석 분야)로 가는 데에는 책이 많은데 학원 교재로는 Python 데이터 분석 입문: 엑셀 및 CSV 파일 처리부터 데이터베이스, 시각화, 통계 분석, 자동화까지라는 책을 많이 쓴다. 이 분야에서 가장 많이 사용하는 Pandas에만 집중하고 싶다면 Pandas 프로젝트를 시작한 웨스 맥키니(Wes Mckinney)가 저술한 'Python 라이브러리를 활용한 데이터 분석'으로 시작해도 좋다.

서울대학교의 일부 강좌에서 학부 수업용 교재로 사용하기 시작하였다.
위키독스에 연재된 강의를 편집한 Python 입문 서적. 기초적인 내용을 다루며 대상 독자도 비전문가라 매우 깊이 있는 책이라 보기는 어렵고 어디까지나 입문 서적이다. 해당 책은 국내에 커뮤니티가 형성(네이버 카페)되어 있어서 질문/답변이 빨라 베스트셀러에 올랐다.
Python 기계학습 딥러닝 분야만큼은 명저가 하나 나왔다. 일본의 사이토 고키가 쓴 "밑바닥부터 시작하는 딥러닝"이라는 책이다. 원서 일본어로 나왔는데, 일본 내에서 사이토 고키가 직접 감수를 맡은 영어판이 같이 나와 이 영어판을 기반으로 미국에서 인기를 끌었다. 그리고 2016년 구글 딥마인드 챌린지 매치인공지능 분야가 한국 일반인에게 알려지면서 해당 도서가 2017년 한국어로 번역 출간되었다. 번역 질도 굉장히 깔끔해서 보기 좋다. 결정적으로 책이 두껍지 않고 얇다. 얇은 책인데 핵심만 집어넣어서 이론을 완성해 가지고 대통일 명저로 꼽힌다.
Python으로 알고리즘 문제를 풀이하는 책도 나와 있다. 과거에는 알고리즘 대회나 코딩 테스트시 C++을 주로 사용해 왔으나 직관적이고 쉬운 문법으로 인해 Python이 점점 인기를 얻고 있다. 이 책은 국내 첫 출간된 Python 알고리즘 코딩 테스트 책으로 자료 구조와 알고리즘을 그림으로 도식화해 이해하기 쉽게 설명하고, 카카오 코딩 테스트 기출 문제 포함 주제별 다양한 알고리즘 코딩 테스트 문제를 다양한 각도에서 효율적인 방식으로 풀이하여 좋은 반응을 얻고 있다. 나무위키 또한 이 책에서 사용을 허락한 일러스트를 이용해 다양한 알고리즘을 효과적으로 설명하고 있다.
일명 혼공파. 비전공자 대상으로 출간된 Python 입문서로, 책이 두꺼운 편이지만 독학이 가능한 수준의 친절한 설명, 예제가 많아서 꽤 오랜 기간 분야 베스트셀러로 빠지지 않고 있다. 기초부터 함수나 클래스, 모듈과 같은 파이썬을 활용할 수 있는 기반을 잡아주기 때문에 기본에서 활용으로 넘어갈 때 좌절했던 사람에게 추천한다는 평이 있다. 책의 저자 윤인성의 유튜브 채널에는 100여개의 무료 강의가 제공되고 있으며, 댓글로 질문을 남기면 저자가 직접 답변을 달아준다. 출판사에서 혼공학습단이라는 스터디 그룹도 운영한다. '혼자 공부하는'을 내세우면서 정작 같이 공부하게 하는 논리가 이상해 보이지만, 의외로 참여자들의 반응이 좋은 편이다.

11. 여담[편집]


  • 구글에서 python이라고 검색하면 제일 위에 뜨는 게 바다 괴물이나 이 아니라 이거다.
  • Python의 공식 문서는 정말 형편없기로 유명하다. 구체적으로는 컴파일러 이론에서 나오는 표기법을 써서 복잡해보이고 예시가 부실한 것이 그 이유인데, 꼭 필요할 때 읽으려면 헤매기 십상이다. 심지어 이는 국내도 아닌 영어가 모국어인 프로그래머들의 공론인데, Python을 찬양하는 사람들도 인정하는 부분이다. 다만 최신 버전으로 갈수록 가독성이 조금씩 개선되어 가고 있다.
  • 2014년 6월 WWDC에서 애플이 공개한 프로그래밍 언어 Swift보다 220배 느리다고 까였다. 유저들은 C 바인딩인 ctypes를 출동시킨다고 부들부들... 하지만 JIT 없는 동적 인터프리터 언어와 컴파일 언어의 성능을 비교하면 어떤 언어를 비교하더라도 당연히 후자가 압도적으로 유리하다는 점에서 이건 비교 자체가 잘못된 것이다. 게다가 암호화 같은 CPU heavy한 작업은 보통 다 C로 짜서 붙인다. Python 해쉬 라이브러리인 hashlib만 해도 코어가 전부 C로 되어있다.
  • Google Android OS에서는 공식적으로 Python을 미지원한다. 하지만 SL4A나 Linux Emulator를 설치 후 Python 실행이 가능하다.
  • 만약 Python으로 짠 코드가 잘 작동되는 것을 넘어 가독성이 높고 유지 보수도 쉬운 코드라면 이를 Python다운(pythonic, 파이써닉) 코드라며 대우한다. 일반 프로그래머라면 이러한 파이써닉 코드를 지향해야 한다.
  • 띵소프트에서 개발한 페리아 연대기에서는 고대 언어라고 한다.
  • Python의 창시자 귀도 반 로섬은 2013년에 재미있게도 한 헤드헌터로부터 경력직 Python 개발자 취업 제안을 받았다고 한다. 즉, Python 창시자에게 Python '경력직' 개발자를 구하는 수준의 메일을 보낸 것.
  • C++, Java와 함께 구글의 3대 개발 언어 중 하나로 알려져 있다.
  • 문명 4의 스크립트 언어로 쓰였다. Lua와 더불어 게임 스크립트 언어의 양대 산맥.
  • 심즈 4 역시 Python을 기반으로 해서 동작한다. 클라이언트를 살짝 보면 수많은 .pyo 파일들의 향연을 볼 수 있다. 심즈 4의 최적화는 나름 우수한 편. 근데 pyo가 3.5 버전에서 삭제되고 pyc로 대체되었다.
  • 킹덤 언더 파이어의 엔진에도 쓰였다. 500여 개의 자체 모듈이 누더기처럼 돌아갔다고 한다.
  • 월드 오브 탱크는 상당 부분이 Python으로 구현되어 있다. 유저가 작성하는 모드도 로직 부분은 Python으로 구현된다.
  • EVE 온라인은 Python의 경량/고속 실행 버전인 Stackless Python으로 작성되었다. 개발사 CCP Games는 Python 재단의 정식 후원자이기도 하다. 2000년대 초에 싱글코어 CPU가 계속 쓰일 줄 알고 서버 코드를 구 버전 Python으로 짰다가 다중 코어 사용이 힘들어지자[68] 눈물겨운 마개조를 거듭하여 Python이라는 언어가 제공할 수 있는 처리 능력을 한계치까지 뽑아서 쓰고 있다.
  • Python패드 프로그래밍 기초 강의. 카이스트 프로그래밍 기초 과목과 호환되는 공개 강의이다. 인터프리터 설치 없이 기초적인 Python 사용법을 배울 수 있다.
  • NumPy+SciPy+matplotlib 조합이 과학 공학 계산용으로 자주 쓰인다.
  • 코드컴뱃 홈페이지. Python을 게임의 형식을 빌려 배울 수 있는 사이트이다.
  • 객체 지향 프로그래밍을 배울 때 추천할 만한 언어이다. 많은 대학들이 C++ 환경에서 OOP를 가르치지만, 이 경우 필요한 객체를 만들어서 쓰는 실습이 많은데 대부분 이미 존재하는 객체를 가져다 쓴다는 개념을 이해하지 못하는 경우가 많다. STL을 쓰면 달라지지만 실습에서 STL을 요구하는 문제가 나오는 경우도 드물고, 주로 사용되는 문자열 변환, 배열 관련 연산 등은 Python에서 따로 임포트할 필요 없이 자료형 자체가 이미 클래스로서 편리하게 클래스 함수를 던져주기 때문에, 클래스의 재활용이라는 측면을 훨씬 이해하기 쉽다. 무엇보다 하루면 다 배울 수 있는 언어이기도 하고. 다만 대학들도 아무런 이유 없이 C++을 객체 지향 입문용으로 채택한 건 아니다. 많은 학생들이 프로그래밍 언어 중 C를 가장 먼저 배우기에, C++은 그나마 익숙한 개념들을 이용해서 객체 지향을 학습할 수 있게 한다. 물론 C++ 프로그래밍은 C 프로그래밍과는 패러다임 자체가 다르므로 주의가 필요하지만, 적어도 "C언어구조체 안에 함수를 정의할 수 있게 하면 C++이다"는 식의 낚시로 학생들에게 심리적 편안함을 줄 수는 있다. 최근에는 객체 지향 입문용 언어로 C++보다 Python을 먼저 가르치는 대학도 늘어나고 있는 추세라, Python부터 먼저 공부하는 것도 나쁘지 않다.
  • 2014년 8월 30일, 유서 깊은 Python 행사인 PyCon이 드디어 한국에서도 성공리에 개최되었다. #공식 홈페이지
  • 2015년 8월 29일, PyCon 2015가 상암 누리꿈스퀘어에서 약 700명의 규모로 개최되었다. #공식 홈페이지
  • 2016년에는 PyCon APAC가 한국에서[69] 성공리에 개최되었다.#공식 홈페이지
  • 2017년에는 PyCon.KR 2017(파이콘 한국 2017)이 강남 코엑스에서 열렸다.(8. 12.~15.)
  • 2018년에는 PyCon.KR에 참가한 IntelliJ IDEA로 유명한 JetBrainsPyCharm 프로젝트 매니저인 Dmitry Trofimov가 행사를 보고 PyCharm 한글화 오픈소스 프로젝트를 열었다. 그러나 번역이 20% 정도 되고 수년째 멈춰 있는 상태... 관심 있는 사람들은 기여해 보자. 다만 개발자들은 호환성을 위해서 영어 버전을 사용하는 경우가 대부분이라 기여를 할 사람이 있을지는 의문이다.
  • 2015년 7월 9일 "같이 번역해서 같이 봅시다"라는 표어를 내걸고 Python 문서를 한글로 번역하는 프로젝트가 생겼다. flowdas / Python 한국어 번역
  • 도널드 글로버가 자신의 노래 가사에 Python을 배우라는 가사를 넣기도 했다.
  • 타오바오에서 다운로드 미러를 제공하고 있다.
  • 귀도 반 로섬은 2019년 10월 30일부로 드랍박스에서 나오고 은퇴하였다.
  • 그리고 2020년 11월 13일, 은퇴 생활이 지루하다며 다시 마이크로소프트 의 개발팀에 합류했다.
  • 디시인사이드 마이너 갤러리Python 마이너 갤러리가 있었으나 접근 제한 조치되어 아카라이브 Python 채널로 이주하였지만 얼마 안 돼 아카라이브에서도 컴퓨터공학 채널로 통합되며 비활성화되었다.
  • 투어라이브의 백엔드 기술의 대부분은 Python으로 구현되어 있다.
  • 2020년 5월, 3.9부터는 비스타와 7을 지원하지 않는다.
  • 중국에서는 Chinese Python이라는, 중국어 문법으로 한자를 쳐서 돌아가는 언어를 개발하기도 했다.
  • 온라인에서 실행시켜 볼 수도 있다. 이 사이트에서 가능하다.
  • 파이선 모듈중 하나인 tarfile에 사용자의 파일을 멋대로 덮어쓸 수 있는 취약점이 발견되었다. 사실 15년전부터 보안에 문제가 있는 모듈임이 알려져 있었으나 개발자노트에 경고문만 남겨둔채 방치한 결과 깃허브에서만 최소 35만개의 리포지터리가 취약점이 있는 것으로 밝혀졌다.

12. 둘러보기[편집]


[ 펼치기 · 접기 ]
기반 학문
수학 (해석학 · 이산수학 · 수리논리학 · 선형대수학 · 미적분학 · 미분방정식 · 대수학 (환론 · 범주론) · 정수론) · 이론 컴퓨터 과학 · 암호학 · 전자공학 · 언어학 (형태론 · 통사론 · 의미론 · 화용론 · 음운론) · 인지과학
SoC · CPU · GPU(그래픽 카드 · GPGPU) · ROM · RAM · SSD · HDD · 참조: 틀:컴퓨터 부품
기술
기계어 · 어셈블리어 · C(C++ · C\#) · Java · Python · BIOS · 절차적 프로그래밍 · 객체 지향 프로그래밍(디자인 패턴) · 해킹 · ROT13 · OTP · IoT · 와이파이 · GPS · 임베디드 · 인공신경망 · OpenGL · EXIF · 마이크로아키텍처 · ACPI · UEFI · NERF · gRPC · 리버스 엔지니어링 · HCI · UI · UX · 대역폭 · DBMS · NoSQL · 해시(SHA · 브루트 포스 · 레인보우 테이블 · salt · 암호화폐) · RSA 암호화
연구및 기타 문서
논리 회로(보수기 · 가산기 · 논리 연산 · 불 대수 · 플립플롭) · 정보이론 · 임베디드 시스템 · 디자인 패턴 · 데이터베이스 · 프로그래밍 언어{컴파일러(어셈블러 · JIT) · 인터프리터 · 유형 이론} · 메타데이터 · 기계학습 · 빅데이터 · 폰노이만 구조 · 양자컴퓨터 · 행위자 모델 · 인코딩(유니코드 · MBCS) · 네트워크 · 컴퓨터 보안 · OCR · 슈퍼컴퓨터 · 튜링 머신 · FPGA · 딥러닝 · 컴퓨터 구조론 · 컴퓨터 비전 · 컴퓨터 그래픽스 · 인공지능 · 시간 복잡도(최적화) · 소프트웨어 개발 방법론 · 정보처리이론 · 재귀 이론 · 자연 언어 처리(기계 번역 · 음성인식)
}}}



프로그래밍 사이트 선정 프로그래밍 언어 순위 목록

⠀[ IEEE Spectrum 2021 ]⠀
{{{#!wiki style="display: inline-block; margin: 0 0 -5px; min-width: 25%"
⠀[ Stack Overflow 2022 ]⠀
{{{#!wiki style="display: inline-block; margin: 0 0 -5px; min-width: 25%">
⠀[ TIOBE 2023 ]⠀

프로그래밍 언어 목록 · 분류 · 문법

TIOBE 선정 올해의 프로그래밍 언어 / Python

[ 펼치기 · 접기 ]
2006년
Ruby

2007년
Python

2008년
C
2009년
Go

2010년
Python

2011년
Objective-C
2017년
C

2018년
Python

2019년
C
2019년
C

2020년
Python

2021년
Python
2020년
Python

2021년
Python

2022년
C++


[각주]



파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2023-11-02 16:50:35에 나무위키 Python 문서에서 가져왔습니다.

[1] 새로운 버전을 매년 출시하고, 출시된 지 5년이 경과된 버전에 대해서는 지원을 종료한다.[2] Python의 엄청나게 빠른 개발 속도와 생산성을 두고 개발자들 사이에서 유행처럼 퍼진 말이다.[3] 귀도 반 로섬은 영어식 발음으로 네덜란드어 발음은 '휘도 판 로싐'이다.[4] 한국인들은 서양인 이름 중간에 반(van) 또는 본/폰(von)이 들어가면 귀족의 후손이라는 통념이 있는데 이 때문에 Python 창시자도 귀족이라는 우스갯소리가 유행한 적이 있다. 실제로 van 때문에 창시자가 귀족인 줄 아는 사람들도 많다. [5] 지금 CPython의 공식 GitHub 저장소를 보면 협업 보조용 봇 이름들이 the-knights-who-say-ni(니라고 말하는 기사)나 bedevere(베디비어) 같이 죄다 몬티 파이튼의 성배의 배역들이다. 많은 Python 교재들에서 변수 이름을 spam, eggs로 짓는 등 드립을 친다. 직접적 관계는 없지만 42도 필수요소. 또한 시작 프로그램 중 하나의 이름이 아이들(Idle)인데, 탄생 배경을 생각해 본다면 몬티 Python의 멤버 에릭 아이들(Eric Idle)의 이름에서 유래하였을 가능성이 높다. 물론 사전적 의미를 생각 안 하는 건 아니라서 심볼마크가 모양이다. 실제로 누가 트위터로 에릭 아이들에게 Python의 이름을 유래를 알려주자 아이들은 "Python이 뭔지는 잘 이해하지 못하지만, 매우 고맙다고 생각한다. 참고로 스팸메일의 유래가 어디서 나왔는지도 생각해 봅시다!"라고 트위터로 쓰자 귀도 반 로섬이 직접 리트윗을 하면서 Python이 무엇인지 설명해 주고 자기는 아직도 몬티 Python을 즐겨 본다고 한다.[6] Python의 이런 두 마리 토끼는 교육 프로그래밍 언어인 BASIC이 자취를 감추게 된 결정적인 이유이다. Python은 BASIC과 달리 학교에서 배우고 끝나는 게 아니라 현업에서도 어느정도 쓰이는 언어이기 때문이다. 농담이 아니고 Python이 교육용 언어로 자리 잡으면서 베이직은 마이크로소프트에 의해 산소 호흡기를 달고 연명만 하는 신세가 됐다. MS가 없으면 BASIC은...[7] Perl의 '하나 이상의 해결법이 존재한다'와 대비된다.[8] C와 Java에서 쓰이는 3항 연산자(ternary operator)
?:
에 비해 라틴어 권에서는 훨씬 직관적이다. 라틴어권 사용자들에게 직관적인 이유는 'A if B (B라면 A다)'라는 식으로 조건을 뒤에 표기하는 언어가 많기 때문인데, 한국을 포함한 다른 언어권이라면 조건 여부에 따라 참:거짓으로 구분되는 3항 연산자 표기가 이해하기가 더 편하다. 거기에 더불어
? :
에 비해
if else
형태로 입력이 길어지는 부분을 싫어하는 경우도 있다.
[9] 원문에는 "네덜란드인이 아닌 이상" 이라는 농담조의 조건이 붙는데, 아마도 Python의 창시자인 귀도 반 로섬을 두고 하는 얘기로 보인다.[10] 실제로 C 계열의 언어에서 중괄호의 위치에 대한 논쟁은 거의 종교적 논쟁에 가깝다. 현재 한국에서 가장 많이 쓰이는 방식은 C언어의 창시자 Kernighan과 Ritchie의 K&R 스타일이다. 그러나 Eric Allman의 방식을 고수하는 사람들도 제법 많다. 이외에도 중괄호 위치를 정하는 다른 방법들이 있다. 그리고 흔치는 않지만 몇몇 사람들은 그냥 들여쓰기고 뭐고 다 무시하고 쭉 작성해 놓기도 한다.[11] 모아놓고 보면 굉장히 지저분할 뿐더러, 당장 입력해야 하는 괄호가 2개나 되고, 괄호 하나라도 잘못 넣으면 블록이 다 꼬여버리는 귀찮은 존재이지만, 블록들을 이리저리 만질 때에는 매우 편리한 존재이다. 특히 C 코드를 종이에 출력해보면 중괄호 있고 없고의 가독성 차이가 의외로 크다. Python에서 쓰는 방식에 대해 다른 언어에서 넘어온 사람은 블록의 시작과 끝 지점을 찾는 부분에서 꽤 불편함을 느끼기도 한다. 대신 괄호를 2개나 일일이 다 넣고, 잘못 넣지 않게 점검도 해 줘야 하는 수고가 없다는 엄청난 장점이 있다.[12] Python의 형제 언어라 불리는 Ruby는 블록의 끝을 end 키워드로 구분하기 때문에 이런 문제에서는 자유로운 편이다.[13] 사족으로 구글 코랩은 들여쓰기에 4문자 대신 2문자가 기본으로 세팅되어 있으나 설정에서 4문자로 변경하면 된다.[14] 웃긴 건 Python 2는 Tab 키를 권장했다는 것. 탭 키를 사용하지 말 것을 요구하는 건 Python 3에서 해당하는 이야기. 물론 Python 2에서도 "탭 키를 쓸 경우에는 잊어버리지 말 것"을 이야기하긴 하나, 그렇다면 처음부터 탭 키를 막았어야 말이 된다. 첨에는 탭이 그렇게 똥인 줄 몰랐어.... PyCharm 등의 주요 편집기에는 탭 키를 썼는지 스페이스 바를 썼는지 시각적으로 구분하여 보여주는 기능이 있으므로 참고.[예외] 기존에 짠 방대한 패키지 코드를 수정하기가 매우 까다로우면 하지 않는다. 다른 사람들이 그 패키지를 사용할 때에 사용하던 코드까지 전부 수정해야 하기 때문에, 비단 패키지를 관리하는 사람만의 문제가 아니라 어쩔 수 없다.[15] 대문자로 써도 상관은 없지만 소문자로 쓰는것이 관례이다.[16] 이건 무려 Python 소프트웨어 재단이 직접 만들고 관리하는 패키지다! Python 코드의 가독성을 위해 재단에서 얼마나 노력하는지가 느껴진다.[17] 튜플을 변경 불가능하게 막는 이유는 보안 때문이다.[18] 루비, 오브젝티브c, 델파이 등이 그렇다.[19] global이나 nonlocal 키워드를 사용하지 않았을 경우[20] return 대신 yield를 써서 생성기(generator)를 반환한 경우.[21] MATLAB의 GUI 기반 모델링 툴박스인 Simulink는 기업용으로 구매하면 기본 toolbox가 1 copy에 천만 원 단위, 각종 전기, 전자, 기계, 유압, 항공 등에 관련한 라이브러리는 추가로 유료로 판매한다. 거기에 C로 포팅 해주는 모듈도 역시 개별적으로 추가 구매해야 한다. 만약 오픈소스 소프트웨어로 Simulink를 대체하고자 한다면 현재로서는 FMI 기능 및 C 코드로의 오토코딩 모듈이 있어야 할 것이다. 게다가 패키지 설치를 참 더럽게 이상하게 만들어 놨다. MATLAB과 같은 목적의 Python 패키지인 NumPy는 모종의 계약을 통해 문법과 함수 등의 많은 부분에서 MATLAB 함수와 호환되게 수정해 버렸고, 안 그래도 꽤 쓰였던 NumPy는 더욱 사용자가 늘어나고 있다. Python의 경우는 지원 라이브러리의 대부분이 오픈소스이기 때문에 저장소에서 그냥 커맨드 라인(pip install 패키지) 한 줄로 필요한 거의 모든 패키지를 설치해서 쓸 수 있다.[22] 다른 언어의 경우 64비트를 넘어가는 매우 큰 수를 사용하려면 Java의 BigInteger, JavaScript의 BigInt와 같이 별개의 클래스를 사용해야 한다.[23] 큰 수 계산하기 위한 내장 함수들을 Python 2부터 저장해 두었기 때문에 가능하다. 유감스럽게도 큰 수 활용 부분은 Python 2와 3가 호환이 안 되는 지점 중 하나다. 내장 함수 몇몇이 2와 3에서 기능이 다르다.[24] Python 3.5에서 추가된 typing 모듈에서도 길이가 가변적인 tuple을 나타내기 위해 사용한다.[25] 이 두 라이브러리로는 Android, iOS 앱 개발도 가능하다. 타 언어 기반의 스마트폰 앱을 개발할 수 있는 크로스 플랫폼 라이브러리로 리액트 네이티브, 플러터 등이 있다.[26] 기본 문법은 타 프로그래밍 언어와의 비교가 실례일 정도로 쉽기에 먼저 타 언어를 접하고 Python을 접한 경우 초등수학을 만난 것처럼 머리의 쥐가 풀릴 정도다. 하지만 이것 역시 문법과 같은 입문단계의 이야기지, 중급 단계인 코루틴과 다양한 모듈 활용만 들어가도 머리를 쥐어뜯어가며 설계하고 코딩하는 자신의 모습을 볼 수 있다.[27] 모든 함수가 일단 클래스 안에 있어야 하며, 전역 함수는 static 함수를 사용하는 형태로 짜야 한다. 객체지향이라는 직관성은 C#이 Python보다 더 좋은 편이다. 두 언어는 서로 다른 용도로 사용되는 경우가 많지만 OpenCV와 같은 곳에서는 둘 다 사용할 수 있기도 하다.[28] 개발과정에서 71.90배의 실행시간 차이는 결코 무시할만한 수치가 아니다![29] Python에서는 이런 단점을 막기위해 다른 언어도 쓸수있도록 만들었다. 예시로 numpy 모듈은 Python의 수학 모듈이지만 많은 횟수의 반복이 필요한 부분을 C로 만들었다.[30] Beazley의 홈페이지에서 더 많은 시각 자료와 영상을 제공하고 있다.[31] 사실 GIL 방식으로 만들 당시 싱글코어가 일반적이었다는 걸 생각해보면 싱글코어에서의 멀티쓰레딩 목적 자체가 멀티코어 성능 향상보다는 이런 다중 이벤트 루프 구현을 하기 위한 것이라고 봐야 하며, 그런 관점에서는 GIL이 합리적인 선택이었다고 할 수 있다.[32] 단, 코루틴이라는 개념 자체가 이런 최근의 프로그래밍 언어에서 처음으로 등장한 것은 아니다. 코루틴의 개념은 1950년대에 이미 나왔다.[33] 실제로 2020년대 들어서 상당수 대학교에서는 입문만 Python으로 한 후 C언어를 주력으로 가르치는 방식을 쓰기도 한다. 당연히 나름 장점이 있으니 이런 방식을 쓰는 것이다.[34] JavaJavascript, C++ 같은 언어로 프로그래밍을 입문했다면, 세세한 기능이나 용도는 매우 다르지만, 적어도 문법은 C언어와 유사하기 때문에 C언어를 비롯한 다른 프로그래밍 언어를 배우는데 꽤 도움이 된다.[35] 후술하겠지만 Microsoft에 취직했는데, Python 속도 개선을 하겠다고 해서 기대된다.[36] 물론 이는 모든 인터프리터 언어의 한계이며, 아예 AOT로 사전 컴파일해서 배포하는 게 아닌 이상 C#이나 JAVA 등 다른 언어들도 같은 문제를 가지고 있다.[37] Java Runtime Environment. 자바 런타임 환경[38] 이 때문에 많은 사람들이 눈치채지 못하는 부가 효과가 있는데, 바로 이 윈도우 내장 .Net은 동시에 프로그램을 개발 환경으로도 쓰일 수 있다는 점이다. 프레임워크가 깔릴때 SDK도 같이 깔리기 때문에 터미널로 SDK를 불러와 프로젝트 생성과 프로젝트 빌드까지 가능하다. [39] 다만 수 GB까지 커지는 것은 조금 과장된 수치로, 아나콘다와 같은 환경이 아닌 가상 환경을 구축해서 거의 아무것도 없이 Python의 기본 패키지만 있는 상태에서, PyQT 정도까지 추가하고 패키징 해도 30MB~40MB 안팎으로 끝낼 수 있다. 거기다 UPX로 패킹하면 용량을 더 줄일 수 있기까지 하다. 다만 UPX를 쓴다는 것은 압축을 한다는 것을 의미하기 때문에, 압축을 풀기 위해 프로그램 실행시 로딩 속도는 더 길어진다.[40] 실제로 Java 데스크톱 앱의 대표 주자인 마인크래프트 자바 에디션은 초창기와 달리 더 이상 JRE를 따로 깔아주지 않아도 잘 작동한다.[41] PyCharm 프로페셔널은 대학생한테는 무료이다.[42] 기본 python 플러그인부터 코드 포매터, Git 연동, AWS 연동, 주피터 노트북 연동, 플라스크 프레임워크 자동완성, 장고 프레임워크 자동완성, conda 환경 지원 등… 수도 없이 많다. 취향에 따라 여러 프로그램을 개발하는 사람들은 100개 가까히 깔고 쓰기도 한다.[43] 물론 어느정도는 다른 개발자들이 만들어놓은 프리셋이 있지만 결국 설치와 세팅은 직접해야된다.[44] 각 언어별로 주어지는 IDE를 설치하면 해당 언어 플러그인은 물론 기본적으로 파이썬 개발환경에서 좀 자주 쓰인다 싶은 라이브러리/프레임워크 관련 지원 플러그인을 싸그리 다 내장하고 있는 올인원이기 때문.[45] 터미널 기반의 노트북 환경 인터프리터. 기존의 인터프리터와 구분되는 UI를 가지고있다. 주피터 노트북은 ipython이 웹 브라우저 기반으로 작동하는 것[46] 알 수 없는 이유로 실행 버튼을 눌러도 스크립트가 전혀 실행되지 않고 별표만 띄우는 일이 종종 있다. 이게 걸려버리면 기존에 정상적으로 실행된 스크립트를 다시 실행시키면 별표만 나온다. 보통 입문자들이 코드를 이상하게 짜면 저리 되는데, 신기한 건 에러도 안 뿜고 별표만 띄우고 뻗어버린다는 거다. 커널을 리셋하면 해결되긴 하는데 머지않아 또 뻗기도 한다. 밑에 있는 구글 콜라보는 이게 좀 덜한 편.[47] 주피터 노트북의 상위 호환 버전. 인터페이스 부분이 노트북에 비해 개선되어 더 깔끔해졌다. 테마나 터미널 설정도 가능해 눈이 편하다. 이전의 노트북을 더 선호하는 사람도 있는 편.[48] 구글에서 제공하는 주피터 노트북 환경으로, 별도의 설치 없이 구글 클라우드 상에서 호스팅되는 가상머신 기반으로 구동된다. 따라서 인터넷 접속이 되는 환경이면 휴대폰, 태블릿 등 모바일 기기에서도 접속이 가능하다. 대형 프로젝트가 아닌 간단한 문제 풀이나 데이터 분석 용도로 사용할 수 있다. 다만 첫 실행의 경우 가상머신 생성 및 시작에 걸리는 시간으로 인해 실행 속도가 다소 느릴 수 있다. 일반적으로 데이터과학 및 머신러닝, 통계 등의 용도로 사용되는 패키지가 다수 설치되어 있어 별도의 패키지 설치 없이 사용하기 편리하며, 필요할 경우 추가 설치 또한 가능하다. 만들어진 노트북 파일은 구글 드라이브에 저장된다.[49] setuptools나 설치에 필요한 다른 기능. 또한 C/C++ 코드를 사용하는 경우에는 해당 시스템에 C/C++ 컴파일러도 설치되어 있어야 한다.[50] setup.py를 실행하는 데 필요한 도구[49]가 있는지 확인하고, 없으면 자동으로 설치하거나 사용자에게 알려주는 기능이 없다. setup.py는 Python 코드로 작성하기 때문에 패키지 이름이나 버전과 같은 메타데이터를 추출하는 것이 까다롭다. setup.py에는 아무 Python 코드나 넣을 수 있으므로 악의적인 코드를 심을 수 있다. setup.py는 setuptools를 직접 import하기 때문에 사용자가 다른 빌드 도구를 선택할 수 없다.[51] npm이 사용하는 package.json과 유사하지만, TOML이라는 파일 형식을 사용한다.[52] Python의 라이브러리 개발 방식은 세월이 흐름에 따라 여러 차례 바뀌었다. 패키지 관리자라는 개념이 없어서 각자 프로그램의 소스 코드를 다운로드해 쓰던 시절에는 setup.py라는 설치 스크립트를 각자 만들어서 Python 프로그램과 함께 배포하는 것이 관행이었다. 복잡한 설치 스크립트가 필요한 이유는 여러 OS 간의 호환성 문제를 해결하기 위함도 있지만, C와 C++ 코드를 함께 사용한 라이브러리를 배포하기 위함이다. 이러한 언어는 해당 OS에 맞게 컴파일해야 하는데, 수많은 OS에 맞춰 컴파일하는 것은 문제가 있었다. 이를 언어 차원에서 지원하기 위해 Python 1.6부터는 distutils라는 빌드 도구를 기본 탑재하였다. 그런데 distutils는 자신의 프로그램이 필요로 하는 다른 패키지를 설치하지 못한다는 치명적인 문제가 있었다. 가령 내가 만든 패키지 A가 B에 의존하고, B는 C에 의존할 경우, 예전에는 사용자가 A, B, C를 일일이 설치해야 했다. 이를 해결하기 위해 setuptools라는 도구가 등장하였다. 그리고 시대가 지나고 세월이 흘러 pip이라는 패키지 관리자와 PyPI라는 패키지 저장소가 등장하면서, setup.py를 만드는 기존의 방식의 단점이 부각되었다.[50] 이 때문에 setup.py를 작성하는 대신 pyproject.toml[51]이라는 설정 파일을 사용하는 표준안인 PEP-518이 등장하였다. pip는 버전 10.0부터 pyproject.toml을 지원했다.[53] PyPI가 Python을 개발하는 재단에 의해 만들어져 운영되고 있는 공식 저장소이기는 하지만 최초의 Python 패키지 저장소는 아니다.[54] 2020년부터 정부 및 200인 이상 기업에게는 유료로 바뀌었다.[55] libjpg, bzip 등 시스템에서 자주 사용되는 패키지 다수가 포함됨[56] 물론 필요에 따라 직접 빌드해서 설치하면 당연히 사용할 수 있지만, 매우 귀찮고 번거로우며 기술적 지식을 요구하므로...[57] Type hint는 다른 도구가 읽고 분석하기 위한 용도이다.[58] CUDA Python(CUDA의 Python wrapper)을 지원하며, ROCm 역시 지원한다. 과거 CPU를 이용한 연산은 Numba, GPU를 이용한 연산은 NumbaPro로 나뉘어져 있었으나 NumbaPro가 Numba에 통합되었다.[59] Tk interface의 약자이다. Tcl이라는 프로그래밍 언어는 Tk와 함께 GUI에 쓰인다.[60] PySide는 Qt for Python에서 공식적으로 지원하고 있다.[61] 하드웨어인 서버 컴퓨터가 아니라, 그 위에서 돌아가는 소프트웨어를 말하는 것이다. 웹 서버는 네트워크 요청을 받아 웹 어플리케이션이 처리할 수 있는 형태로 만들어 넘겨주며, 소켓이나 프로세스 풀과 같은 자원을 관리한다.[62] '위스키'라고 읽음[63] 근데 메타의 인스타그램은 메타에서 개조한 파이썬 런타임으로 실행되는거라 일반 파이썬보다 4배 빠르다..[64] 심지어 C++도 사용할 수 있다.[65] 단지 헤더파일을 복붙하는 것으로 작동한다.[66] 프로그램 매매는 동시에 5억 원 이상의 매매를 내는 거래로, 원래는 한국예탁결제원의 승인을 받은 기관 투자자나 외국인 투자자만 사전에 예탁결제원에 프로그램을 등록하고 매매할 수 있다. 그런데 동시에 5억 원 미만의 거래를 하는 개인 투자자들까지 예탁결제원이 간섭하기는 뭐했는지 이쪽은 규제 사각지대다.[67] 일본Ruby가 대세라서, Ruby로 하는 알고리즘 트레이딩이 많다. Ruby로 만든 트레이딩 툴은 Python과 비슷한 퍼포먼스가 난다.[68] 전장에서 일어나는 일을 제외한 나머지 시시콜콜한 일을 다른 코어로 돌리기는 하였으나, 게임의 최소 단위인 전장은 구조상의 한계로 하나의 코어만 동원할 수 있다.[69] 강남 코엑스에서 13~14일 아카마이에서 15일(튜토리얼).