Languages/Python2013.09.30 16:44

이 방법은 http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python에 공개된 방법입니다. 아래에는 결과만 보여드립니다. 


import itertools
def erat2( ):
    D = {  }
    yield 2
    for q in itertools.islice(itertools.count(3), 0, None, 2):
        p = D.pop(q, None)
        if p is None:
            D[q*q] = q
            yield q
        else:
            x = p + q
            while x in D or not (x&1):
                x += p
            D[x] = p


이 함수를 실행하는 함수를 다음과 같이 정의합니다. 


def get_primes_erat(n):
  return list(itertools.takewhile(lambda p: p<n, erat2()))


실행해 보면 다음과 같은 결과를 얻습니다. 


>>> get_primes_erat(1000)

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,

 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163

, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251

, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349

, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443

, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557

, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647

, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757

, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863

, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983

, 991, 997]

>>>


제일 신속한 방법이라고 알려져 있습니다. 



저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Thoughts2011.04.28 16:07
언더커버 보스라는 텔레비전 프로그램이 있습니다. 회사의 CEO (그러니까 보스죠)로 하여금 회사의 밑바닥 생활을 경험하게 하는 것이 골자인 프로그램이죠.



이 프로그램의 구성은 단순합니다. CEO를 변장시켜서 회사의 말단 직원으로 투입합니다. 그런 다음 한 일주일 동안 뺑이(?)를 치게 합니다. 이 과정을 통해 CEO는 회사를 지탱하는 말단 직원들의 고충과 비효율을 경험하죠. 그런 다음 다시 자기 자리로 돌아갑니다. 그리고 나서는 그들의 근무 환경과 효율을 개선할 새로운 아이디어나 제도를 내놓고, 자신에게 풍성한(?) 교훈을 안겨준 직원들에게 포상을 합니다. 그리고는 끝.

물론 이런 식의 프로그램이 갖는 문제점을 나열하라면 한도 끝도 없습니다. 포상을 받는 직원을 제외한 다른 직원들은, 그런 기회를 누릴 자격이 없었던 걸까요? 아마 아닐 겁니다. 그러니, 오늘은 그냥 리더쉽 이야기만 하도록 하죠.

언더커버 보스라는 프로그램이 나름대로 고정 시청자를 확보하면서 지속적으로 방영되고 있는 이유를 곱씹어보면 별게 없습니다. 그저 옛 성현의 말을 그대로 실천했을 뿐이죠.

"니가 한번 해봐라. 말만큼 쉽나."

겪어 보지 않으면 모른다

일반적인 관리자들이 빠지기 쉬운 함정 중 하나는, '위에서 보면 모든 것이 단순해 보인다'라는 점입니다. 그도 그럴 것이, 관리자들이 갖게 되는 지식의 대부분은 '보고 체계'를 통해 전달된 것들입니다. 보고라는 것은 보통 텍스트와 이미지로 구성된 문서입니다. 보고하는 사람에 의해 한 번 추상화(abstraction)된 결과물이죠.

관리자는 보통 이 추상화된 결과물들이 만들어 내는 다이어그램들의 연결관계로 문제를 파악합니다. 추상화의 핵심은 단순화(simplification)입니다. 단순하게 정리되지 않은 결과물을 보고하는 사람은 없습니다. 관리자는 보통 한번에 여러 직원들과 문제들을 상대하게 마련이고, 스스로 결과물을 분석할 시간적 여력이 없습니다. 그러니 관리자에게 보고되는 내용들은 가능한 한 단순화되어야 하고, 그 과정에서 문제의 세부사항은 생략되게 마련입니다.

어떻게 보고 해야 하나

세부사항이 생략될 경우에 발생하는 가장 큰 위험은 '관리자가 보는 일정 추정치'와 '직원들이 보는 일정 추정치'가 달라진다는 점입니다. 관리자들은 태스크 스위칭 오버헤드 같은 세부사항에 신경을 쓰지 않기 때문에 직원들에게 가능한 한 많은 일거리를 주려는 경향이 있고, 이런 일거리들이 어떻게 프로젝트를 지연시키는 지에 대해서는 신경을 쓰지 않습니다.

그런 상황에서 '참 또는 거짓' 그러니까 '무엇이 됐고 무엇이 실패했다'는 식으로 보고를 하게 되면, 일정 추정치를 정확하게 만들수가 없게 됩니다. 해결책은 문제를 둘러싼 상황적 맥락(context)을 기술하는 것이죠.

문제는 '상황적 맥락'이라는 것이 굉장히 모호하다는 겁니다. 여러분은 여러분이 처한 환경을 몇 줄 만으로, 가능한한 정확하게 묘사하려는 시도를 해 보신적이 있으십니까? 상황적 맥락은 텍스트로 추상화하기 가장 어려운 부분 중 하나입니다.

문제점 리스트가 왜 중요한가

상황적 맥락을 기술하기가 어렵다면, 프로젝트 진행 중간에 발생하는 이벤트들을 기록해 두는 것이 도움이 됩니다. 이런 이벤트들은 이슈 추적 시스템(issue tracking system)을 통해서 나열해 둘 수 있습니다. 이슈들의 발생 빈도, 이슈들의 양 등을 정확하게 기록해두면, 프로젝트 중간중간에 어떤 일들이 발생했고 그 일이 어떤 환경에서 발생했으며 어떤 맥락에서 처리되었는지 확인할 수 있습니다.

문제점 리스트가 갖는 가장 큰 장점은 '관리자들이 좋아하는 추상화된 형태'로 보여주기 좋다는 점이죠. 개수, 양, 그래프 등등 고도로 추상화된 수단을 동원해 시각화하기 편하다는 거에요.말로 설명하면 납득하지 못하는 사람도, 제대로 정리된 그래프를 보여주면서 이야기하면 프로젝트 중간에 발생한 불확실성의 수준을 이해하는 경향이 있으니까요.


위의 사진에서처럼 '실제로 겪어본다는 것'에는 영감을 불러 일으키는 마력이 있습니다. 지금 관리자인 사람들도 과거에는 말단 직원이었을 거에요. '경험'이라는 것에는 마력같은 부분이 있죠. 보통 관리자들이 갖고 있는 '과거의 기억'은 윤색되기 마련입니다. '과거에 나는 이랬어!' 뭐 이런 자부심 같은 것들이죠.

문제는 그런 자부심이 나쁘다는 것이 아니라, 그런 자부심이 때로 프로젝트 진행 당사자가 겪는 문제들을 올바르게 파악하지 못하도록 방해한다는 점입니다.

언더커버 보스의 CEO들도 회사의 발전을 위해 고군분투하고 있다는 점에서는 다른 직원들과 다를 바가 없는 사람들입니다. 다만 그들에게 주어지는 정보의 양이 제한적이다 보니, 프로젝트 진도와 방향에 대해, 더 나아가서는 회사의 발전 방향에 대해 '오해'를 할 수 있다는 것이 문제일 뿐이죠.

관리자들이 여러분 주변의 문제를 더 자주 파악할 수 있도록, 눈에 잘 띄는 곳에 문제점 리스트를 두세요. 그리고 그 문제점 리스트가 왁자지껄해지도록 만드세요. 할 수 있다면, 익명 게시판 같은 형태도 나쁘진 않을 겁니다. (많은 사람들이 선호하는 방법은 아니지만요.) 그럼 아마 관리자들은 여러분들이 무슨 생각을 하고 있는지, 현장에서 무슨 일들이 벌어지고 있는지 더 잘 파악할 수 있을겁니다.

물론 어떤 관리자들은 그런 정보를 봐도 '그건 네가 잘 몰라서 그래'라고 말할지 모릅니다. 하지만 그런 상황에 처하더라도, 어떤 의미에서건 '문제를 노출한다는 것'은 좋은 거에요.

한두번이면 모르겠지만, 잽도 여러번 때리다 보면 결정적 한방이 될 수 있거든요.





신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 잘보고 갑니다

    2011.04.28 16:17 신고 [ ADDR : EDIT/ DEL : REPLY ]

Languages/Erlang2008.09.01 17:07
앞선 글에서 Erlang의 타입 시스템이 C와 같은 프로그래밍 언어와 어떻게 다른지에 대한 이야기를 잠깐 했습니다. 아톰, 리스트, 투플 같은 낯선 언어 구조물들에 대한 언급도 잠깐 했었구요.

이번 글에서는 그 '낯선 구조물들'에 대한 설명을 조금 해 보려고 합니다. 먼저 아톰입니다.

Erlang에서 아톰은 소문자로 시작하는 이름입니다. 이름이라고는 하지만 그에 대응하는 값을 갖는 것은 아니고, 그 자체로 의미가 있습니다. Ruby라는 프로그래밍 언어에 익숙한 분이라면 아마 심볼(symbol)이라는 개념을 아실텐데요. Ruby에서 심볼은 다음과 같은 형태를 가집니다.

:foo

심볼은 그 자체로 유일합니다. Erlang의 아톰도 마찬가지입니다. C의 매크로 상수같은 것과 비슷한 개념이 아니냐고 물을 분도 계실텐데, #define을 사용해 정의한 매크로 상수들은 '값으로 치환되는 이름'이고 그 이름 자체가 비교의 대상이 될 수는 없기 때문에 같은 개념이라고 볼 수는 없습니다. 이해가 잘 되지 않는다면, 우선은 그냥 '사용자 정의 상수'쯤으로 생각해 버립시다. 그 이름이 곧 그 값인 상수 말이죠.

일례로, Erlang 셸에서 다음과 같이 아톰을 입력해 보면, 아톰 그 자체가 값으로 반환되는 것을 볼 수 있습니다. 별도의 값으로 치환되는 이름이 아니라는 뜻입니다. 아톰이 유용하게 사용되는 사례는 잠시 후 투플에 대해 설명하면서 살펴보도록 하겠습니다.

1> foo.
foo

투플은 C라면 구조체와 비슷한 개념인데, {와 }를 둘러싸 만듭니다. 가령 다음과 같은 C 구조체가 있다고 합시다.

struct Entry {
    int code;
    int value;
};

C에서 이 구조체로 변수를 만들고 그 값을 조작하려면 다음과 같이 하게 될 것입니다.

Entry a;
a.code = 3;
a.value = 12;

앞서도 말했지만 Erlang에는 '정적으로 변수에 타입을 준다'는 개념이 없기 때문에, 그냥 다음과 같이 합니다.

1> P = { 3, 12 }.

그런데 이렇게 하면 이 투플이 대체 무슨 투플인지 알 길이 전혀 없다는 문제가 있습니다. 그러므로 보통은 다음과 같이 하는 쪽을 선호합니다.

1> P = { entry, {code, 3}, {value, 12} }.

아톰을 통해 각각의 정보 단위에 이름을 주었다는 점을 유의해서 봅시다. 이렇게 하면 뭔가 잘 정의된 의미 구조를 갖는 투플을 만들고 사용할 수 있습니다. 그런데 대체 저 투플 안에 저장된 값을 뽑아낼때는 대체 어떻게 해야 하나요? -_-;;

앞선 글에서 = 연산자가 사실은 '대응 연산자'라고 말씀드렸던 것을 상기합시다. 값을 뽑아내려면, 이 연산자를 가지고 대응 규칙을 정의하면 됩니다. 다음을 보시죠. 붉은 색으로 표시한 부분은 아직 사용된 적이 없는 변수들이라는 점을 유의해 보십시다.

2> {entry, CodeTuple, ValueTuple} = P.
{entry,{code,3},{value,12}}
3> CodeTuple.
{code,3}
4> ValueTuple.
{value,12}

대응 연산자를 사용해 대응 규칙을 정의하고 있습니다. 대응 규칙이라는 좀 무시무시한 용어를 쓰긴 했습니다만, 사실 대층 규칙이라는 것은 별게 아닙니다. = 연산자 오른쪽에 오는 투플의 각 요소가 = 연산자 왼쪽에 오는 투플의 각 요소들에 어떻게 대응되는지를 명시하는 것에 불과합니다. 그 결과, CodeTuple은 {code, 3}에 대응되었고, ValueTuple은 {value, 12}에 대응되었습니다. 이런 식으로 하면 복잡한 투플 내의 임의 위치에 있는 값을 알아낼 수 있게 됩니다. 이 규칙을 조금 응용하면, 다음과 같이 해도 되겠군요.

5> {entry, {code, X}, {value, Y}} = P.
{entry,{code,3},{value,12}}
6> X.
3
7> Y.
12

이 예제들을 통해 아톰, 투플, 그리고 변수의 사용에 대해 약간의 감을 잡으셨을 수 있으리라 생각됩니다.

말씀드리는 김에 조금 더 나가볼까요? 대응 관계가 만들어진 변수를 통상 바운드(bound)된 변수라고 부릅니다. 그럼 언바운드 변수라는 것도 있나요? 네. 있긴 합니다. 언바운드 변수는 대응 규칙을 좀 더 느슨하게 만들고자 할 때 사용합니다. 다음 예제를 보시죠.

8> {_, {_, A}, {_, B}} = P.
{entry,{code,3},{value,12}}
9> A.
3
10> B.
12

언바운드 변수 '_'를 사용해서 대응 규칙을 만들면 투플의 구조만 일치하면 그 특정 위치에 오는 값을 뽑아낼 수 있습니다. (뽑아낼 수 있는 값에는 제한이 없습니다. 아톰이 될 수도 있고, 투플이 될 수도 있고, 리스트가 될 수도 있겠죠.)

그럼 이제 마지막으로 리스트에 대해서 말씀드리고 이번 글은 맺겠습니다. 리스트는 '['와 ',' 그리고 ']'를 가지고 만드는, 일련의 값의 묶음입니다. 묶이는 대상은 일반 값이 될 수도 있고, 투플이나 아톰이 될 수도 있고, 또다른 리스트가 될 수도 있습니다. 하나의 리스트 안에는 서로 다른 타입의 값들이 어떤 순서로도 저장될 수 있습니다.

11> L = [2, CodeTuple, ValueTuple, X, Y].
[2,{code,3},{value,12},3,12]

가령 지금까지의 예제들을 충실하게 실행한 상태에서 위와 같이 하면, 보시다시피 [2,{code,3},{value,12},3,12]의 리스트가 만들어지게 되죠.

[다음 글에서 계속...]




신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. <A href="http://blueandyellow.blog22.fc2.com/">SEX</A>できるサイト<A href="http://pyridoxiamine.blog34.fc2.com/">逆援助</A>専門の出会い<A href="http://gyakuenjyoyattemita.blog10.fc2.com/">逆援助</A>でセレブ女性とH<A href="http://douteiget.blog102.fc2.com/">童貞</A>喪失も可能<A href="http://hurinxxx.blog19.fc2.com/">不倫</A>

    2009.02.28 10:46 신고 [ ADDR : EDIT/ DEL : REPLY ]