Python
덤프버전 : r (♥ 0)
분류
이 문서는 나무위키의 이 토론에서 "도서의 구체적인 이름은 네이버 책 서비스 기준으로 작성자가 다른 최근 1년 네티즌리뷰가 5개 이상이거나 1개 이상 대학에서 교육용으로 사용되고 있을 때 서술 가능하다. 이를 충족하지 않으면 서술에서 제거할 수 있다. 이미지는 등록하지 않는다."(으)로 합의되었습니다.
타 위키에서의 합의내용이 더위키에서 강제되지는 않지만 문서를 편집하실때 참고하시기 바랍니다.
[각주]
1. 개요[편집]
파이썬은 1991년에 발표된 인터프리터 방식의 프로그래밍 언어이다. 파이썬의 강력한 라이브러리와 풍부한 생태계를 통해, 데이터를 수집하고 분석하며 시각화하기 용이하다. 데이터 분석 분야에서 파이썬의 사용이 널리 퍼진 이유 중 하나는, 다른 프로그래밍 언어에 비해 직관적이기 때문에 비교적 쉽고 간편하게 사용할 수 있기 때문이다. 파이썬은 웹 프레임워크와 같은 라이브러리와 함께 사용될 경우, 데이터를 수집하고 처리한 후 결과를 웹 애플리케이션으로 표시하는 것도 가능하다.Life is short, you need Python.
인생은 짧기에, 당신에겐 Python이 필요하다.[2]
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)
factorial = lambda x: 1 if x == 0 else x * factorial(x - 1)
이런 식도 가능하다]이것은 남이 작성한 코드를 내가 읽고 이해해야 하는 경우 아주 절실히 느낄 수 있다. PEP 20에서 제시된 Python 기본 철학(The Zen of Python)에 자세히 나열되어 있다.
따라서 다른 언어들의 코딩 스타일은 각자의 취향에 맞게 발산 진화하는 반면, Python은 위의 철학들을 만족시키는 하나의 스타일로 수렴 진화하는 성향이 있다.[10] 이런 성향은 다른 언어에는 없는 Python스러움(pythonic)이라는 독특한 개념을 낳게 되었는데, 복잡하지 않으면서 의미가 명확하고, 코드의 축약보다 뚜렷하게 보이는 흐름을 중시하는 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!)
3.2. 명확한 권장 코드 스타일[편집]
특유의 철학 때문에 코딩 스타일에 엄격한 편이다. 잘 작동하는지와는 별개로 가독성을 위해 이렇게 쓰기를 권장한다는 스타일 가이드까지 있다. Python 공식 문서에서는 Python에 맞는 코딩 스타일을 지키기를 권장하는데, 이것이 바로 PEP 8이다.
- 블록 처리 규칙
def factorial(x):
return 1
if x == 0:
return x * factorial(x - 1)
else:
- 작명 규칙
아래는 이름에 대한 대표적인 스타일 가이드이다.
- 일반적으로 스네이크 표기를 쓰되, 특정한 종류에는 파스칼 표기를 쓴다. 표기법은 코딩 스타일 참고.
- 변수는 소문자로 시작하며 [15] , 내부변수(internal)는 맨 앞에 밑줄(underbar, _) 1개로 시작하며, 숨은변수(hidden)은 밑줄 2개로 시작한다.
- attribute_name = 0
- _protected_attribute_name = 0
- __hidden_attribute_name = 0
- 문법 규칙
- 한 줄은 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으로 바뀐 게 아니다. 파이썬에서 타언어의 상수와 같은것을 만들려면 클래스를 통해 불변객체를 만들어야한다면
다만 객체 지향 언어라는 표현은 주의해서 사용할 필요가 있다. 객체 지향은 어디까지나 프로그래밍 패러다임이므로, 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으로 만든 프로그램을 같은 객체 지향 프로그래밍 언어인 Java나 C++로 만드려는 순간 숨이 턱 막힐 정도.
인터프리터 언어이면서 우수한 자료형과 다양한 모듈 등을 제공해 개발 기간이 단축되는 것이 특징. 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가 발생했을 때 필요한 처리 작업을 수행하는 시간보다 월등히 긴 경우가 많아 여러 개의 쓰레드를 관리하기 위한 자원만 낭비하는 꼴이기 때문이다.
따라서 Go나 Erlang 같은 프로그래밍 언어들은 코루틴이란 개념을 도입해[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) 설치 프로그램이 자동으로 인스톨러와 연동되는 등으로.
Java나 C\#과 같은 '가상 실행 환경'을 통해 돌아가는 언어의 경우 해당 가상 환경이 얼마나 널리 보급되는지가 언어의 흥망을 좌우하는 매우 중요한 요소이므로, 해당 언어를 지원하는 단체나 기업에서 매우 공을 들여 최대한 쉽고 간단명료하게 설치할 수 있도록 최선을 다한다. Java의 경우 Java로 된 프로그램을 실행하기 위해서는 JRE[37] 이라는, '자바 프로그램을 실행하기 위한 실행 환경'을 꼭 설치해 줘야 하지만, JRE는 깔끔하게 정돈된 공식 사이트에서 쉽게 다운받아서 다른 응용 프로그램 설치하듯이
반면 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. 구현체 목록[편집]
자세한 내용은 Python/구현체 문서를 참고하십시오.
7. 개발 환경[편집]
7.1. 명령줄 인터페이스[편집]
영어로는 CLI(Command Line Interface)라고 한다.
- 터미널
- IDLE
7.2. 통합 개발 환경[편집]
영어로는 IDE(Integrated Development Environment)라고 한다. 터미널, 디버거, 확장(Extension), 코드 편집기 등 개발에 도움울 주는 각종 기능들이 담겨 있는 앱을 가리킨다. IDE는 작업 중인 코드 상의 문제를 추적해 주거나 스타일 수정을 해 주는 패키지와의 연동을 통해 GUI 상에서 코드 퀄리티 관리를 자동으로 해 주는 편리한 기능도 제공한다.
- 물론 VSC는 다양한 플러그인을 지원한다는 장점이 있지만, 모든 환경 세팅[42] 을 개발자가 직접 해야 하기에[43] 설치만 하면 (거의 99%) 모든 게 다 준비되어 있는 JetBrains 사의 툴을 선호하는 사람들도 상당히 많다.[44] 패스트푸드점에 비유해서 쉽게 말하면 VS Code는 구성품목을 하나 하나 골라 까는 써브웨이고, JetBrains 시리즈는 스페셜 할인팩 하나 시키면 어지간히 배불러터질만큼 왕창 끼워주는 버거킹에 가깝다. 자기 입맛대로 사소한 것 하나하나 고르는 게 좋으면 VSCode가 맞고, 환경 까는건 재미없으니 적당히 치우고 빨리 코딩이나 하고싶은 사람은 JetBrains가 맞다.
- Spyder (소스코드)
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
pip install package
편리하고 공식적인 PyPI를 사용하지 왜 굳이 이런 사설 패키지 저장소를 사용하냐고 궁금해할 수도 있는데, 이는 의존성(Dependency) 관리 때문이다. PyPI는 의존성 충족 여부를 단순히 패키지별로 확인하며, 두 패키지의 의존성이 충돌되는 경우를 막아주지 않는다. 그러나 conda의 경우 의존성 트리를 철저하게 확인하여 그러한 의존성 모순이 없도록 강제한다. 따라서 의존성 관계가 복잡한 경우 conda를 사용하여 관리하는 것이 편리하다.
수학/과학/공학 업무에 필요한 NumPy, SciPy, Jupyter Notebook 등의 수백 개의 패키지와 도구를 한 번에 깔아줄 뿐만 아니라 GUI도 제공하는 Anaconda와, 코어 기능인 패키지 매니저 및 가상환경 관리자만을 제공하는 Miniconda가 있다. 다만 Anaconda는 설치에 시간이 오래 걸리고, 어차피 몇백 개나 되는 패키지를 다 쓸 일은 잘 없기 때문에 Conda 사용에 숙련되면 Miniconda를 쓰는 것도 좋다. Miniconda는 패키지를 자신이 직접 찾아서 깔아야 하지만, 어차피 필요한 패키지를 설치하는 것은 install <패키지명> 몇 번만 두드려 보면 간단히 해결된다.
conda install package
각종 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 -m venv <가상환경 경로>
라는 단 한 줄의 명령만으로 매우 간편하게 사용이 가능하다. 가상환경 설치 후 < 가상 환경 경로 >/bin/activate
을 실행하면 가상환경이 실행된다. 가상환경 실행 중 deactive
라는 명령으로 바로 가상환경을 종료할 수 있다.- virtualenv
virtualenv my-venv
# 특정 Python 버전으로 된 환경을 구성하려는 경우에는...
virtualenv my-venv --python=<특정 버전>
- conda
conda create --name my-venv
# 특정 Python 버전으로 된 환경을 구성하려는 경우에는...
conda create --name my-venv --python=<특정 버전>
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)을 통해 수치 알고리즘을 가속화한다. 또한 CPU 및 GPU[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를 개발할 수도 있다. 물론 데스크탑 한정이다.
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 기반(비동기형) 패키지들이다.
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. 문법[편집]
자세한 내용은 Python/문법 문서를 참고하십시오.
10. 학습[편집]
유튜브, 온라인 책, 도서, 코딩 공부 앱 중 본인에게 가장 쉬운 방법을 택하는 것이 좋은 학습의 첫걸음이 될 것이다.
책의 경우 온라인으로 볼 수 있는 책은 링크를 첨부하는 것을 원칙으로 한다.
다음은 유튜브, 온라인 책, 도서, 코딩 공부 앱에 대한 설명을 차례대로 첨부하였다.
10.1. 유튜브[편집]
10.2. 위키독스[편집]
실제 책과 동등한 수준의 내용을 온라인으로 편하게 배울 수 있다.
10.3. 도서[편집]
Python 관련 도서 중에선 2023년 현재까지도 이거다! 할 만한 명저가 없다. 프로그래밍 입문부터 실사용까지 오만 가지 책들이 난립해 있어서 핵심을 관통하는 주제를 딱히 잡기 어려워서인 듯하다. Python 관련 책은 대형 서점에 가면 Python 분류가 따로 잡혀서 어마어마하게 난립해 있을 정도로 경쟁이 치열하다. Python만 따로 분류가 잡혀서 매대를 꽉 채운 Python 책들을 보다 보면 춘추전국시대 저리가라 할 수준이다. 그러나 도서들이 죄다 특정 분야에만 치중해서 전반적인 내용을 관통한 책은 별로 없는 것은 문제다. Ruby 같은 경우는 기타 프로그래밍 언어에 Programming Ruby 딱 한 권만 달아놔도 재고가 없을 정도로 인기인 것과 정반대. Python은 책이 워낙 많다 보니 서점에도 재고가 수두룩하다. 이렇게 Python 관련 책은 선택지가 많으니 인터넷에서 잘 비교해 보고 고르기를 추천.
Python 입문을 벗어나고 나면, 기계학습 분야로 갈 것이냐, 빅데이터 분야로 갈 것이냐에 따라서 추천 도서가 달라진다. 생활코딩에서도 이거 때문에 관련 문의가 페이스북 페이지에 올라오는 편이다. 빅데이터 분야(데이터 분석 분야)로 가는 데에는 책이 많은데 학원 교재로는 Python 데이터 분석 입문: 엑셀 및 CSV 파일 처리부터 데이터베이스, 시각화, 통계 분석, 자동화까지라는 책을 많이 쓴다. 이 분야에서 가장 많이 사용하는 Pandas에만 집중하고 싶다면 Pandas 프로젝트를 시작한 웨스 맥키니(Wes Mckinney)가 저술한 'Python 라이브러리를 활용한 데이터 분석'으로 시작해도 좋다.
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로 유명한 JetBrains의 PyCharm 프로젝트 매니저인 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. 둘러보기[편집]
[각주]
?:
에 비해 라틴어 권에서는 훨씬 직관적이다. 라틴어권 사용자들에게 직관적인 이유는 'A if B (B라면 A다)'라는 식으로 조건을 뒤에 표기하는 언어가 많기 때문인데, 한국을 포함한 다른 언어권이라면 조건 여부에 따라 참:거짓으로 구분되는 3항 연산자 표기가 이해하기가 더 편하다. 거기에 더불어 ? :
에 비해 if else
형태로 입력이 길어지는 부분을 싫어하는 경우도 있다.[9] 원문에는 "네덜란드인이 아닌 이상" 이라는 농담조의 조건이 붙는데, 아마도 Python의 창시자인 귀도 반 로섬을 두고 하는 얘기로 보인다.[10] 실제로 C 계열의 언어에서 중괄호의 위치에 대한 논쟁은 거의 종교적 논쟁에 가깝다. 현재 한국에서 가장 많이 쓰이는 방식은 C언어의 창시자 Kernighan과 Ritchie의 K&R 스타일이다. 그러나 Eric Allman의 방식을 고수하는 사람들도 제법 많다. 이외에도 중괄호 위치를 정하는 다른 방법들이 있다.