본문 바로가기

데이터과학

파이썬의 컴퓨팅 라이브러리 - 사이파이(SciPy)

SciPy

SciPy('사이파이'라고 읽음)는 과학기술계산을 위한 Python 라이브러리이다. NumPy, Matplotlib, pandas, SymPy와 연계되어 있다(특히 NumPy). 가능한 알고리즘과 관련 부패키지는 다음과 같다.

  • Clustering package (scipy.cluster)
  • Constants (scipy.constants)
  • Discrete Fourier transforms (scipy.fftpack)
  • Integration and ODEs (scipy.integrate)
  • Interpolation (scipy.interpolate)
  • Input and output (scipy.io)
  • Linear algebra (scipy.linalg)
  • Miscellaneous routines (scipy.misc)
  • Multi-dimensional image processing (scipy.ndimage)
  • Orthogonal distance regression (scipy.odr)
  • Optimization and root finding (scipy.optimize)
  • Signal processing (scipy.signal)
  • Sparse matrices (scipy.sparse)
  • Sparse linear algebra (scipy.sparse.linalg)
  • Compressed Sparse Graph Routines (scipy.sparse.csgraph)
  • Spatial algorithms and data structures (scipy.spatial)
  • Special functions (scipy.special)
  • Statistical functions (scipy.stats)
  • Statistical functions for masked arrays (scipy.stats.mstats)
  • Low-level callback functions

설치

Anaconda 사용자는 별도의 인스톨없이 바로 사용할 수 있다.

NumPy와의 관계와 설정 확인

SciPy NumPy 상위에서 구동되는 라이브러리 정도로 이해해도 무방하다. SciPy는 기본적으로 NumPy ndarray를 기본 자료형으로 사용한다. 일부 패키지는 중복되지만(, 선형대수numpy.linalg vs. scipy.linalg, 이산푸리에변환numpy.fft vs. scipy.fftpack) SciPy가 보다 풍부한 기능을 제공한다.

NumPy, SciPy 등은 수치계산을 위한 패키지이므로 성능이 중요하다. 특히 BLAS LAPACK 등 기본 수치라이브러리로 어떤 것을 사용했는가가 중요하다. 최근 Intel MKL을 도입하였다numpy.show_config() scipy.show_config()를 통해 확인할 수 있다.

>>> import numpy

>>> numpy.show_config()

mkl_info:

    libraries = ['mkl_rt']

    library_dirs = ['C:/ProgramData/Anaconda3\\Library\\lib']

    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]

    include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', ...]

blas_mkl_info:

    <위와 동일>

blas_opt_info:

    <위와 동일>

lapack_mkl_info:

    <위와 동일>

lapack_opt_info:

    <위와 동일>

>>> import scipy

>>> scipy.show_config()

openblas_lapack_info:

  NOT AVAILABLE

lapack_mkl_info:

    libraries = ['mkl_rt']

    library_dirs = ['C:/ProgramData/Anaconda3\\Library\\lib']

    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]

    include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', ...]

lapack_opt_info:

    <위와 동일>

blas_mkl_info:

    <위와 동일>

blas_opt_info:

    <위와 동일>

>>> 

Timing

과학기술계산 연산은 계산 속도가 중요한 척도이다. 어떤 작업이 수행된 시간을 측정하는 것은 CPU time wall time으로 보통 구분한다.

  • CPU time : 작업을 수행한 프로세서의 시간을 합산한 시간time.process_time()에서 리턴된 값의 차이로 계산
  • wall time : 작업을 수행한 시간time.perf_counter()이나 time.time()에서 리턴되는 값의 차이time_perf_counter()가 보다 정확한 값을 제시

예를 들어 A라는 작업을 2개 프로세서(코어)에서 동시에 쉬지지않고 작업했는데 2초가 걸렸다면, CPU time 4, wall time 2초이다. 작업을 수행하는 개별 프로세서는 중간에 쉴때가 존재하므로 단순히 (wall time) * (프로세서 수) CPU time이 계산되지는 않는다.

import numpy as np

import scipy.linalg import linalg

 

A = np.random.random(size=(10000,10000))

 

cpuTime   = time.process_time()    # CPU time

wallTime1 = time.perf_counter()   # wall time

wallTime2 = time.time()            # wall time

 

linalg.norm(A)

 

cpuTime   = time.process_time()-cpuTime     # CPU time

wallTime1 = time.perf_counter()-wallTime1   # wall time

wallTime2 = time.time()-wallTime2           # wall time

 

print('cpuTime : ', cpuTime)

print('wallTime1 : ',wallTime1)

print('wallTime2 : ',wallTime2)

주요 참고 사이트

 출처 https://wikidocs.net/15636