콘텐츠로 건너뛰기
Home » python » Page 18

python

파이썬에 대한 업계의 10대 미신

페이팔 블로그에서 10 Myths of Enterprise Python이라는 글을 발행했다. 애들이나 배우는 장난감같은 언어라는 선입견이 서구권에서도 아직 많은가보다. 드롭박스의 메인 개발언어이고[1. 드롭박스는 거의 대부분의 코드가 파이썬이고 심지어 파이썬 창시자인 귀도 반 로썸도 구글에서 드롭박스로 이직했다.] 유튜브도 파이썬을 많이 사용한 것으로 알려져있다. 그 외에도 어디 면접에 나온 퀴즈들을 보면 구글은 이상하리만치 파이썬에 최적화된 문제들을 많이 내는 것 같더라. 거기 풀이에 올라온 자바 개발자들의 풀이를 보면 약간의 미안함(?)이랄까 그런 게 느껴지기도 함. https://www.paypal-engineering.com/2014/12/10/10-myths-of-enterprise-python/

삽입정렬

삽입정렬(insertion sort)은 기본적인 제자리 정렬 알고리듬 중 하나로, 배열 내의 어떤 위치의 원소를 해당 배열의 가능한 가장 왼쪽 자리에 ‘삽입’하는 동작을 통해 정렬을 수행한다. 삽입 정렬의 이론적인 성능은 O_{(n^2)}이지만, 데이터가 정렬된 상태에 가깝다면 삽입 동작이 그 만큼 적게 일어나므로 더 빨라질 수 있다. 현실 세계의 데이터는 완전히 랜덤하기보다는 약간은 정렬된 경향을 가지므로 같은 O_{(n^2)}인 버블정렬 알고리듬보다는 더 빠르게 동작하는 것으로 알려져 있다.

더 보기 »삽입정렬

버블 정렬 (Bubble Sort)

버블정렬은 정렬 중에서 가장 기본적이고 쉬운 알고리듬이다. 버블정렬은 배열의 앞에서부터 큰 원소를 뒤쪽으로 보내는 작업을 반복적으로 시행하여 배열 전체를 정렬한다. 이 때 큰 값들이 물속에서 거품이 떠오르는 것처럼 움직이기 때문에 ‘버블’이라는 이름이 붙었다.

간단한 예를 통해서 버블 정렬이 어떻게 작동하는지 살펴보자. 아래와 같은 배열이 있다고 가정하자.

더 보기 »버블 정렬 (Bubble Sort)

파이썬 소켓서버 예제

간단한 소켓서버 구현예제. 여기서 send 하는 내용을 HTTP 규격에 맞춰서 보내면 웹 브라우저로 접속해서 볼 수 있게 된다. 웹서버를 직접 구현해보고자 한다면 출발점은 소켓서버 구현 -> HTTP 프로토콜 이해 -> 소켓서버를 웹서버로 확장하는 방식으로 발전시켜 나갈 수 있다. 하지만 파이썬에서는 이미 HTTP 서버 모듈도 존재하고 이는 꽤 쓸만하므로 따로 만드는 건 삽질이다. (뭐 좋은 경험은 될 수 있겠지만…) 더 보기 »파이썬 소켓서버 예제

이진탐색트리 (Binary Search Tree) 구현하기 – python

Binary Search Tree

이진 탐색 트리는 이진 트리 구조 속에 이진 탐색 알고리듬을 이용하여 키-값 쌍을 저장하는, 어찌보면 맵(혹은 사전이라고도 하는) 구조와 유사한 형태이다. 이진 탐색 자체가 데이터가 정렬된 상태를 전제하기 때문에, 구조 내에 자료를 삽입/삭제하는 과정이 단순하지는 않지만, 어떤 정렬된 상태의 키를 기준으로 데이터를 찾는데는 매우 유리한 구조이다.
이진 탐색 트리는 특정 노드가 어디에 위치하는데에는 크게 관심이 없다. 단지 이를 사용하여 효율적인 탐색을 할 수 있게 한다. 보면 알겠지만 해시테이블이 메모리 공간을 더 사용하고 반대급부로 성능을 얻는 것과는 달리, 이진 탐색 트리는 트리 구조 자체의 특성을 사용하므로 부가적인 메모리 공간의 낭비는 적다고 볼 수 있다.
더 보기 »이진탐색트리 (Binary Search Tree) 구현하기 – python

데코레이터를 통한 memoization

파이썬 데코레이터를 통한 memoization

피보나치 수열은 재귀 알고리듬의 대표적인 문제인데, 간단히 memoization을 통해서 성능을 개선하는 방법을 찾아보자. 테스트는 파이썬 3.4에서 진행했다.

def fib(n):
    if n in (1, 2):
        return 1
    return fib(n - 1) + fib(n - 2)

위 코드는 피보나치 수열의 정의를 그대로 따르는 코드이다. 이 코드를 사용하여 피보나치 수열의 64번째 항을 구하면… 얼마나 걸릴지는 모르겠다. 실행해놓고 이 글을 다 쓸 때까지도 결과가 나오지 않았다. fib(64)는 재귀 호출을 18,446,744,073,709,551,615 회나 해야하기 때문이다. (\( 2^{64} – 1 \)번을 계산해야 한다) 36번째 항을 계산하는데만해도 14초가 넘게 걸렸다. 이 알고리듬은 매우 간결하고 깔끔한 코드로 보이지만, 불필요한 중복 계산을 너무 많이 한다. 64번째 항을 구하기 위해서는 63번째와 62번째 항을 구하는데 그럼 62번째는 2번 계산된다. 즉 1에 가까워질수록 중복 계산횟수가 기하급수적으로 늘어나는 것이다.
더 보기 »데코레이터를 통한 memoization

웹서버란 무엇인가

What is a web server?

웹서버는 많은 웹개발자들에게는 블랙박스나 마법의 상자 같은 물건인데, 실상 그것은 하나의 프로그램이다. 이 프로그램은 80번 포트에 소켓을 열고 이 포트를 통해 들어오는 HTTP 요청을 받아, 다시 응답을 보내주는 프로그램이다. 요즘의 웹서버들은 이런 기본적인 기능에 덧붙여 여러가지 부가기능들을 제공한다. 하지만 이러한 기능들은 모두 부가적인 것이며, 웹 서버의 본질은 HTTP 응답을 내보배는 것이다. 만약 에코서버를 작성해본 경험이 있다면 웹서버 역시 이러한 에코 서버와 크게 다르지 않다. 단지 들어오는 입력에 대해 좀 더 많은 손질을 해서 내보내는 것일 뿐이다. 더 보기 »웹서버란 무엇인가

(파이썬) 약한 참조 사용하기

파이썬과 C를 비교하면서 차이점을 이야기하는 사람 중에는 “파이썬은 별도의 메모리 관리가 필요없다”는 이야기를 하는 사람들이 있다. 실제로 프로그램이 실행되는 동안 객체를 위한 메모리는 파이썬에 의해 자동으로 할당받게 되고, 객체의 파괴 역시 대부분 파이썬이 자동으로 처리한다. 따라서 파이썬 코드에서는 malloc()이나 free() 같은 메모리 관리를 위한 코드가 존재하지 않는 것은 사실이다.

파이썬에서 메모리 관리에 있어 가장 주요한 개념은 참조수인데, 참조수는 어떤 객체 외부에서 그 객체를 참조하는 지점의 개수이다. 즉 어떤 객체를 누군가 참조한다는 것은, 외부의 누군가가 그 객체가 계속 살아있기를 원한다는 의미이므로 그 수명을 유지하게 하며, 반대로 이러한 참조점이 없는 객체는 사용할 수 없는 객체가 되기 때문에 파괴되어도 상관없다는 의미가 된다.

파이썬의 모든 것은 객체이고, 모든 파이썬 변수는 객체에 붙는 이름이다. 즉 객체에 어떤 이름이 붙었다는 것은 이 객체를 참조하는 곳이 한 군데 생겼다는 뜻이다. 그 외에 객체가 다른 객체의 속성으로 바인딩되는 것도 참조수를 늘리는 것이며, 리스트나 사전과 같은 컨테이너에 포함되는 것도 참조수가 증가하는 효과를 갖는다.

만약 그 이름이 다른 객체를 가리키도록 바뀌게 되면, 파이썬은 내부적으로 참조수를 1 떨어뜨린다. 그리하여 참조수가 0이된 객체는 그냥 그 자리에서 즉시 파괴되는 식이다. 그러니, 별도로 사용하지 않는 객체를 명시적으로 파괴하는 코드를 호출할 필요가 없는 것이다. 하지만 세상 일이란게 단순해보이더라도 그게 늘 마음처럼 한결같지는 않은 법이다. 이러한 참조수에 의한 메모리 관리가 실패할 수 있는 경우와, 그럼 문제를 어떻게 해결할 수 있는지를 살펴보도록 하자.

더 보기 »(파이썬) 약한 참조 사용하기