Skip to content

Latest commit

 

History

History
166 lines (157 loc) · 8.32 KB

File metadata and controls

166 lines (157 loc) · 8.32 KB

Python Programming An Introduction to Computer Science

Chapter3 Computing with Numbers (p.57~ p.82)

Numeric Data Types

  • 데이터 (Data)
    • 컴퓨터 프로그램에 의해 저장, 조작되는 정보 (본문)
    • 일반적인 의미에서의 데이터 (데이터 분석 전문가 가이드, 한국데이터진흥원)
      • 추론과 추정의 근거를 이루는 사실 (옥스포드 대사전)
        • 존재적 특성 (객관적 사실)
        • 당위적 특성 (추론, 예측, 전망, 추정을 위한 근거)
  • 숫자 자료형 (Numeric Data Type)
    • python 2.x1
      • int
        • 32bit 정수
        • 부분을 취할 수 없을 경우와 연산의 효율성을 위해 실수형과 구분
      • long
        • 크기 제한이 없는 정수
      • float
        • 실수
      • complex
        • 복소수
        • 1+2j2 또는 complex(x, y)3
        • cmath로 연산4
    • python 3.x
      • int
        • python 2.2에서 long과 통합5
      • float
      • complex
  • 숫자 자료형 관련 연산자 (Numeric Operations)
    • 정수와 정수 연산 시 정수 반환 (예외 /)
    • 실수와 실수 연산 시 실수 반환 (예외 /)
    • 정수와 실수 연산 시 정수를 실수로 변환한 뒤 실수 반환
연산자 기능
+ 덧셈
- 나눗셈
* 곱셈
/ 나눗셈 자동으로 실수형으로 형변환 (python3에서 변경)6
** 지수
abs() 절대값
// 정수 나눗셈
% 나머지
  • 형변환 (Type Conversions)과 반올림 (Rounding)
    • 정수를 실수로 변환 시 원래 값에 .0이 됨
    • 실수를 정수로 변환 시 소수점 이하 절삭
    • 반올림은 round(floating_number, number_of_digits_after_decimal_point) 이용
      • 두 번째 인자 값이 -n일 경우 소수점 이전 n번째에서 반올림
  • import math를 통해 연산 관련 기능을 제공하는 math 라이브러리 사용 가능

컴퓨터 산수의 한계 (Limitations of Computer Arithmetic)

  • 부동 소수점으로 실수를 표현해 실수값이 정확하지 않음7
  • 큰 정수 연산이 어려움
    • 정수 자료형의 크기가 고정되었기 때문
    • python 2.2에서 intlong이 통합되며, int의 크기가 임의적으로 증가하기 때문에 python에서 현재 이와 같은 문제 없음

부동 소수점

  • 지수표기법과 유사
  • 수와 자리수로 나뉨
  • 연산 시 비트를 줄일 수 있음
  • 단 값이 대략적으로 표시되기 떄문에 연산이 부정확
    • 실제 값을 저장하는 범위가 고정되어 그 이후 값을 0으로 처리
  • 이를 이용해서 미분하는 메소드가 존재
    • 앱실론을 이를 이용해 지정
  • 딥러닝 등에서 수치가 정확한 연산이 필요하지는 않음
  • 모바일 쪽에서도 이슈
  • oracle RDBMS에서 number type의 크기를 지정해줄 때도 이와 관련 됨
    • 예시) Number(실제 수를 표시할 범위, 소수점 범위)

고정 소수점

  • 정확한 연산을 위해 필요

32bit vs 64bit 연산

  • bit는 CPU가 처리하는 데이터의 최소 단위인 레지스터의 크기를 뜻함8
    • 이하 출처
    • 컴퓨터의 프로세서 내에서 자료를 보관하는 아주 빠른 기억 장소
    • 현재 계산을 수행 중인 값을 저장하는 데 사용
    • 현재 로드-스토어 설계를 사용해, 메인 메모리에서 레지스터로 데이터를 옮겨와 데이터를 처리하고 그 후 그 내용을 다시 레지스터에서 메인 메모리로 저장함
  • 비트의 차이는 CPU (안과 밖을 연결하는) 파이프라인 수의 차이
  • 램 크기가 핵심적으로 차이남
    • 램 크기가 커지면서 표기할 수 있는 주소의 범위가 넓어짐
    • CPU로 오갈 수 있는 데이터가 많아짐
    • 32bit의 경우 처리할 수 가상 메모리가 4GB임
  • 실무적으로 메모리를 얼마나 다채롭게 사용할 수 있는가
  • 가용 공간이 넓어지면서 명령어 집합이 늘어남
    • 텐서플로우의 warning은 해당 명령어가 달라 발생하는 메시지
  • Hz로 표시되는 부분은 연산이 수행될 수 있는 횟수
    • 오실레이터 (oscillator)
      • 연산마다 전선의 길이가 달라 여러 연산을 한 번에 수행할 경우 흐름의 역전이 발생
      • 마디를 나누어 검증을 수행하는데 오실레이터가 이에 활용됨

Data Structure

  • chunk 단위로 병렬 처리 시 딕셔너리, 리스트 등 자료구조 많이 사용
  • 메모리 상 차이로 구분할 수 있음
  • container sequence
    • 서로 다른 자료형의 항목을 담을 수 있는 자료 구조
    • 객체에 대한 참조를 담고 있음
      • [Question] 참조를 담고 있다면 주소값이 들어가는데 왜 연속적인 공간 확보가 어려운가?
    • linked list
      • 포인터로써 다음 자료의 위치를 가리키는 자료 구조
      • 읽기가 느림
    • python의 리스트
      • 유연하게 모든 것을 담을 수 있다는 게 최대 장점
      • 단 위처럼 모든 것을 담을 수 있는 경우 어떤 게 들어갈지 모르므로 메모리에 연속적으로 공간을 확보하기 어려움
  • flat sequence
    • 단 하나의 자료형만 담을 수 있는 자료 구조
    • 값을 직접 저장하는 자료 구조
    • array
      • 메모리상 여러 자료를 연속적으로 올리는 자료 구조
  • named tuple
    • tuple
    • 해시 구조
    • 순서를 활용하고 싶을 때 사용
    • ordered dictionary로 바로 바꿈
  • Hashable
    • 처음 만들 때 오버헤드가 있으나 검색 시간이 짧은 장점이 있음
    • 일반적으로 def__init__이나 Hashable은 def__hash__ 구조
      • __ 내장 메소드
    • equal로 비교하고, 포인터 주소가 아니고 hash값으로써 동일한지 판단
      • iteration 도는 중에 바꿀 경우 오류가 발생
    • set 연산이 가능
      • 데이터 존재 여부를 편하게 확인할 수 있음
  • dictionary
    • hash 값 때문에 커짐
  • ordered dictionary
    • order가 들어가 dictionary보다도 커짐
  • 위의 자료 구조로써 pandas 사용
  • dictionary, tuple comprehension도 가능

Database

  • CRUD를 목적으로 함
  • 디스크 IO일 경우 네트워크에서 시간이 많이 소요
  • 이전에는 RDBMS를 사용했으나, 좀더 유연한 구조를 위해 NoSQL 사용
  • wrtiing 비용이 크기 때문에 lazy하게 함

Hive vs Hbase

  • 둘다 SQL과 같이 NoSQL를 접근할 수 있다는 특징을 가짐

  • Hbase

    • 인덱스를 사용해 RDBMS와 유사
  • Hive

    • Read에 중점을 둔 데이터베이스
    • 파티션을 사용한다는 게 특징
      • 파티션은 가상 CPU를 사용해, 한 CPU가 하나의 파티션을 담당
    • 파티션을 사용하면 파티션 단위로 검색
      • 파티션을 사용하지 않을 경우 full scan
      • 하지만 파티션을 잘못 지정할 경우 full scan과 다를 바 없음
    • 파티션은 일반적으로 id 끝 1-2자리로 분리
  • test code는 vim보다 ide에서 적합

Baekjoon

  • python Testcase 기본으로 제공
  • 테스트 코드 Testcase 상속받아야 함
  • 함수는 test로 시작해야 하며 문제 발생 시 빠르게 파악하기 위해서 함수명을 길게 작성해줘야 함
  • 자동화가 되어야 함
    • 이떄 Mock 사용
  • Mock
    • input 자동화
      • 데코레이터 @mock.patch("__main__.__builtin__.input") 추가
    • 데이터베이스 부하 때문에도 Mock 사용

Footnotes

  1. https://docs.python.org/2.4/lib/typesnumeric.html

  2. https://python.bakyeono.net/chapter-4-5.html

  3. https://www.geeksforgeeks.org/complex-numbers-in-python-set-1-introduction/

  4. https://docs.python.org/3.0/reference/datamodel.html#object.__complex__

  5. https://zeth.net/2014/05/27/python_long_type.html

  6. http://ledgku.tistory.com/43

  7. 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 적는 것, https://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90

  8. https://technet.microsoft.com/ko-kr/library/cc700734.aspx