콘텐츠로 건너뛰기
Home » Development » Python » 페이지 16

Python

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

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

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

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

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

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

마크 다운을 PDF 문서로 변환하기

마크 다운을 HTML 문서로 변환하고, 다시 HTML 문서를 PDF로 변환하는 과정을 거치면 PDF 파일을 얻을 수 있다. HTML 파일을 PDF로 만드는 데는 파이썬으로 제작된 xhtml2pdf라는 패키지가 있긴 하지만 동작이 좀 불안정하거나 한글이 제대로 렌더링 되지 않는 (한글을 제대로 랜더링하는 방법은 있는데, 이 경우 CSS가 제대로 적용되지 않는다.) 등의 문제가 있어서 웹킷 엔진으로 렌더링하는 것과 같은 결과를 얻을 수 있는 PhantomJS를 사용하기로 결정했다.
더 보기 »마크 다운을 PDF 문서로 변환하기

오일러 프로젝트 31

영국의 화폐 단위는 파운드(£)와 펜스(p)이고, 동전의 종류는 아래와 같습니다.

1p, 2p, 5p, 10p, 20p, 50p, £1 (100p), £2 (200p)

이 동전들을 가지고 2파운드를 만드는 방법들은 다양할 것입니다. 예를 하나 들면 이렇습니다.

1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p

2파운드를 만드는 서로 다른 방법은 모두 몇 가지나 있습니까?

https://euler.synap.co.kr/problem=31
더 보기 »오일러 프로젝트 31

GIL

GIL CPython은 Global Interpreter Lock, 즉 GIL이라는 것을 사용한다. GIL은 일종의 뮤텍스로 복수의 네이티브 파이썬 스레드가 동시에 바이트코드를 실행하지 못하도록 하는 것이다. CPython의 메모리 관리 방식은 스레드-안전하지 못하기 때문에 이러한 방식의 락이 필요하다. 반대로 GIL을 도입하면서부터 다른 기능들은 GIL이 강제하는 부수효과에 의존하기 시작하기도 한다. GIL은 양면성을 가지는데, 멀티스레드로 디자인된 CPython 프로그램이 멀티프로세서 시스템의 장점을 제대로 살리지 못하게 한다는 약점을 가지고 있다. (덕분에 파이썬 커뮤니티는 GIL을 강제하는 것 때문에 까이고 있다.) 하지만 다행히다 I/O나 이미지처리, NumPy등을 사용하는 고도의 수학계산과 같은 부분들은… 더 보기 »GIL

python regex cheatsheet

Cheatsheet for python regex

Regex module

re 모듈이 정규식을 지원한다.

match

re.match() 함수는 주어진 패턴을 문자열의 시작지점부터 적용하여 매칭되는 결과가 있으면 match 객체를, 그렇지 않은 경우 None을 리턴한다.

> re.match(r'\d', 'a1c2')
==> None
> re.match(r'a', 'a1c2')
<_sre.SRE_Match object at 0x028543A0>

더 보기 »python regex cheatsheet

pypy virtualenv 만들기

pypy의 virtualenv를 만들 때 오류가 나면서 진행이 되지 않는 경우가 있다. (아마 pypy의 디렉터리 구조가 좀 달라서 그럴 것 같은데) > c:pypy\bin\virtualenv.exe pypyenv 정상적인 가상환경이라면 다음의 요소가 가상환경 디렉토리에 들어있어야 한다. lib_pypy 디렉터리 lib-python 디렉터리 activate.bat 스크립트 따라서 1, 2를 수동으로 통째로 복사해 넣고, python2.7의 virtualenv 를 사용, 파이썬 실행파일을 지정해주는 것으로 방식을 대체해주면 된다. > cp -rv c:/pypy/lib-python pypypenv/ > cp -rv c:/pypy/lib_pypy pypyenv/ > c:\python27\Scripts\virtualenv.exe -p c:pypypypy.exe pypyenv cp는 msys를 설치해서 실행되는거고, 그렇지 않다면 xcopy /s 명령을 사용하면… 더 보기 »pypy virtualenv 만들기

파이썬 포매팅 함수

파이썬에서는 C와 유사한 포맷팅 문자열을 사용하는 방법이 있는데, 이와 별개로 문자열 객체의 .format() 메소드를 사용하여 포맷팅된 문자열을 생성하는 방법이 있다. 이 때 사용되는 포맷팅 규격은 조금 다른데, 생각보다 간단하고 훨씬 편리할 수 있으니 자주 애용해서 몸에 익히도록 하자. 문법 포맷팅 함수는 다음과 같이 사용한다. >>> "score:{0}, wins:{1}".format(3, 1) 'score:3, wins:1' %타입과 달리 중괄호에 들어간 숫자를 사용해서 포맷팅할 값들을 쓸 수 있다. 값은 인덱스 번호로 쓰여지기 때문에 하나의 값을 여러 번 사용하는 것도 가능하다. >>> "{0} {0} {0}".format(123) '123 123 123'… 더 보기 »파이썬 포매팅 함수

파이썬에서 파일 복사

폴더마다 같은 종류의 다른 사이즈의 아이콘들이 들어 있는데 이중 48X48 크기의 아이콘들 중 좀 쓸만한 것들을 뽑아서 다른 폴더에 모으려고 했는데, 양이 너무 많았다. 차라리 그 크기의 아이콘들만 모두 모아서 한 곳에 모아두고 보는 게 좋겠다 싶었다.
파이썬은 이럴때 쓰라고 있는 겁니다. 내가 쓰고자 하는 파일들은 모두~”48.png”로 끝나는 파일이라 이 파일들만 복사하면 된다. 특이하게 os 모듈이 아니라 shutil 모듈에 파일 복사 기능이 들어있더라.
더 보기 »파이썬에서 파일 복사

파일에서 한줄씩 읽어 들이기 – Objective-C

파이썬에서는 텍스트 파일을 가리키는 파일 객체는 파일 내용의 각 라인에 대한 이터레이터처럼 작동한다. 따라서 별다른 노력을 들이지 않고 for … in 구문을 통해서 텍스트 파일의 각 라인을 읽어서 처리하는 것이 가능하다. 이 기능의 멋진 점은 파일 객체가 느긋하게 동작하기 때문에 각 라인이 필요한 시점에 한 라인씩 읽어들인다는 것인데, 따라서 각 라인의 길이가 적절하다면 파일의 크기가 아무리 크더라도 안전하게 읽어들일 수 있다는 것이다. Objective-C에서 텍스트 파일은 보통 NSString의 stringWithContentOfFile: 메소드를 사용한다. 이 메소드의 문제는 파일을 한 번에 읽어들인 다는 점이다. 따라서… 더 보기 »파일에서 한줄씩 읽어 들이기 – Objective-C