파이썬을 좀 더 효율적으로 사용하기 위한 시리즈를 써볼까 한다.


파이썬은 언어의 유연성과 개발 편의성을 위해 수행속도를 다소 희생한 언어로,

태생적으로 C계열이나 Java보다 느리다.


그럼에도 어느정도의 효율성은 가지고 있고,

요즘에는 효율성이 다소 요구되는 웹서버 같은 곳에서도 많이 사용되는것 같다.


하지만 하이레벨 언어의 특성상 적당히 배워서 대충 쓰다보면,

하부 구조의 잘못된 이해로 수행속도에서 불필요한 큰 손실을 보게 되는 경우가 생기게 된다.


이 시리즈에서는 파이썬에서 극한의 효율성을 달성하기 위한 방법이 아니라,

잘못된 이해로 인한 수행속도 저하를 막기위해 알아야 할것들에 대해

간단하게 다뤄보고자 한다.


시간날때마다 조금씩- 
저작자 표시
신고

'Effective Python' 카테고리의 다른 글

Effective Python (0). Intro  (0) 2011.08.12
Posted by youknow04
수치 계산을 하다보면 컴퓨터의 부동소수점 계산 오차때문에

a<b여야 하는것이 b<a 가 된다거나, 혹은 a==b가 되는 경우가 발생한다.


그런데 컴퓨터의 두 실수(float) a,b가
1. a<b
2. b<a
3. a==b

중에 어느것에도 속하지 않을 수 있을까?

정답은 yes 이다.



아래의 C++코드를 보자.
float  a=1.0, b=sqrt(-1.0);
if(a<b || a==b || b<a ) printf("OK.");
else printf("what happen? (%g)\n",b);


문제는 b=sqrt(-1.0)에서 발생한다.

b=sqrt(-1.0) 을 할경우, 음의 루트값이기 때문에 허수값이 나오고 float형인 b에는 담을 수 없다.

그래서 b에는 -1.#IND 값이 들어가게 된다.

IND는 indeterminate의 약자로 정해지지 않았다는 말이다.


양수, 음수를 0.0으로 나누었을때 보게되는 +-1.#INF (infinite,양/음 의 무한대)와는 다르게 -1.#IND은 크기가 없다.

문제되는것은 크기가 없기 때문에 <,>,==의 모든 비교에 대해서 false를 내놓는다는 것이다.

그래서 위의 코드를 실행하면 놀랍게도 if문을 통과해서 "what happend? (-1.#IND)" 을 보게된다.


(위 코드의 실행결과)


일반적으로는 위의 예제처럼 일부러 sqrt안에 음수를 넣을일은 없겠지만,

복잡한 수치계산을 하다보면, 이론상으로는 0이 될 수 없는 수식도 수치오차때문에 -0.0001 이 될 수도 있고,

그 수식이 루트(sqrt)안에 있다면 바로 -1.#IND이 뜨면서 이후의 루틴에서 많은것을 망쳐놓으므로 조심해야한다.


하다못해 수식의 결과를 소팅 하더라도, 원소중에 하나라도 -1.#IND가 섞여있다면

혼자만 문제가 생기는게 아니라, 소팅 전체 결과가 엉망이 되어버린다.
저작자 표시
신고

'공부' 카테고리의 다른 글

작지도,크지도, 같지도 않다. -1.#IND  (0) 2010.12.29
언어의 모호성  (0) 2010.11.16
가변인수(va_arg)를 이용한 계산오차 줄이기  (3) 2010.08.02
계산기하 - 원 포함 알고리즘 코딩  (0) 2010.06.03
NP, NP-COMPLETE, NP-HARD  (7) 2010.05.05
for문에서 j  (3) 2010.04.26
Posted by youknow04

언어의 모호성

공부 2010.11.16 17:25
컴파일러 같이 굉장히 제한적인 포멧(소스코드)를 파싱할때에도 종종 모호성이 발생하곤 하는데,

최근에 MSRA에서 온톨로지 연구하시던분이 와서 세미나하는것을 듣다보니

역시나 온톨로지와 같이 일반언어(프로그래밍 언어가 아닌)를 연구하는 사람들은

언어의 엄청난 모호성 때문에 정말 힘들어 하는것 같다.


일상에서 언어를 정말 대화의 목적으로 사용할때는 언어가 얼마나 모호한지 잘 느끼기 힘들지만,

좀 더 공부를 하다보면 얼마나 모호한지를 잘 알게 된다.

아래 문장을 보자.

I shoot a buck.


대화중에 forest라거나 hunting에 대해서 언급하다가 이 문장을 들으면

"I shoot a buck(나는 사슴을 쐈다)" 가 되지만,

gamble이라거나 casino에 대해서 언급하다가 들으면

"I shoot a buck (나는 1달러를 베팅했다)"

가 된다.


위의 예는 이번 세미나때 들은것이 아니라 예전에 인지과학 스터디를 할때

사람이 언어를 인지하는 방식에 대해 나온 예였는데,

이번 세미나때에는 저거보다 더 심각한 예도 들었다.


아래 문장을 보자.

A rather than B such as C

1. PET rather than DOG such as CAT

2. LIZARD rather than ANIMAL such as REPTILE


위의 문장에서 1번과 2번의 관계를 그림으로 나타내보면


이렇게 된다.

위에서의 I shoot a buck의 경우에는 문맥에 따라서 단어자체가 가지는 뜻의 모호성이 있었을뿐

A가 B를 C했다 같은 '구조'자체에는 변화가 없었는데

여기서는 단어들간의 구조가 바뀌었다.

심지어 전후 문맥같은것도 없이 문장의 나머지 구성요소(rather than, such as)들은 완전히 똑같았는데

거꾸로 단어에대한 배경지식이 문장에서 자기들간의 구조에 영향을 미친거다.


이런거 처리하려면 참 힘들것 같다.
저작자 표시
신고

'공부' 카테고리의 다른 글

작지도,크지도, 같지도 않다. -1.#IND  (0) 2010.12.29
언어의 모호성  (0) 2010.11.16
가변인수(va_arg)를 이용한 계산오차 줄이기  (3) 2010.08.02
계산기하 - 원 포함 알고리즘 코딩  (0) 2010.06.03
NP, NP-COMPLETE, NP-HARD  (7) 2010.05.05
for문에서 j  (3) 2010.04.26
Posted by youknow04


티스토리 툴바