컴퓨터 공부/파이썬 공부

    고성능 파이썬(7)

    C언어로 컴파일하기 코드를 빠르게 하는 가장 쉬운 방법은 처리할 작업의 양을 줄이는 것이다. 작업의 양을 줄이는 방법은 최적의 알고리즘을 사용하고 수행할 명령의 수를 줄이는것이다. 이때 수행할 명령의 수를 줄이는 가장 쉬운 방법은 코드를 기계어로 컴파일 하는 것이다. 컴파일로 빨라지는 부분은 대체로 수학적인 부분이다. 같은 연산을 반보가는 코드를 포함할때 임시 객체를 많이 사용하기 때문이다. 수학 계산에 초점을 맞춘 코드라면 직접 작성한 포트란 루틴이 C로 작성한 루틴보다 더 빠를것이다. 하지만 이는 전문가적인 수준이고 보통 C코드만큼의 성능을 기대할수있다. 이렇게 컴파일을 할때 노력과 실행정도를 따져서 성능개선을 해야하는 부분도 있다. 컴파일 방식 AOT(사이썬) : 미리 컴파일 컴퓨터에 특화된 정적 ..

    고성능 파이썬(6)

    행렬과 벡터계산 루프 안에서 sin(num_iterations) 값은 변경되지 않으므로 매번 계산할 필요가 없다. 파이썬은 벡터 연산을 기본으로 제공하지 않는다. 그 이유는 파이썬의 리스트는 실제 데이터를 가리키는 포인터를 저장한다는 점과 파이썬 바이트 코드는 벡터 연산에 최적화되지 않았다는 점이다. 이때 포인터는 벡터와 행렬 연산에서 성능 저하의 원인이 된다. 예를 들어 example[5][2] 를 실행하면 example 리스트에서 5번째 항목을 찾아 반환한 다음 2번째 항목을 찾아야지만 그 항목의 데이터 위치를 알수있기 때문이다. CPU 로 행렬을 계산하게 되면 어마어마한 미스 레이턴시가 발생한다. 이로 인해 CPU의 성능이 느려지는데, 그 이유는 CPU의 캐시에 데이터를 여러벌 준비할수 없고, 만약..

    고성능 파이썬(5)

    이터레이터와 제너레이터 파이썬 코드는 루프를 지속되는데 range 함수를 호출하는것처럼 보인다. 많약 1억개의 배열을 루프로 만든다고 한다면,이는 시간이 오래걸리고 메모리도 많이 필요할것이다. 제너레이터를 사용하면 이런 종류의 함수를 필요할때마다 지연 계산 할수 있어서 성능상에 영향을 주지 않고도 이런 목적의 함수가 제공하는 높은 코드 가독성을 얻을수 있다. 이로써 피보나치 수를 제너레이터로 1억번 구현하고도 메모리를 적게 사용하고 속도도 더 빠르다

    고성능 파이썬(4)

    시간복잡도 정렬되지 않은 리스트, 튜플 최적화 모델 : 0(log n) 사전, 셋 : 0(1) - 해시 테이블 사전과 셋은 메모리를 많이 사용하기 때문에 실제 속도는 해시 함수에 전적으로 의존하여, 만일 해시 함수가 느리다면 사전과 셋의 모든 연산도 마찬가지로 느릴것이다. 리스트 vs 셋 유일한 이름찾기 항목 1만 개 중 유일한 이름이 7412 개인 phonebook 리스트를 사용하면 셋과 리스트의 차이가 252배정도 차이가 난다. 사전과 셋의 동작원리 해시 테이블을 처음 생성하면 배열을 사용할때처럼 메모리부터 할당한다. 배열은 데이터를 추가하려면 사용하지 않은 메모리 블록을 찾아 데이터를 추가하고, 필요할때 크기를 조정한다 그러나 해시 테이블에서는 먼저 이 연속적인 메모리에 데이터를 나열할 방법을 생각..