기본 콘텐츠로 건너뛰기

추천 게시물

[Go] 고루틴

런타임(Runtime) visual code에서 브라우저 실행 단축키: Alt+B Go runtime은 메모리 관리, 가비지 수집, 동시성을 포함하여 Go 프로그림의 실행을 관리하는 역할을 합니다. 이 문서에서는 Go runtime을 자세히 살펴보고 아키텍초, 특성과 장점을 살펴봅니다. Go Runtime Architecture Go runtime은 모듈식이고 유연하게 설계되었으며 개발자가 특정 요구사항에 따라 동작을 사용자 정의할 수 있는 계층적 아키텍쳐를 갖추고 있습니다. 런타임은 스케줄러(schedualer), 가비지 수집기(garbage collector), 메모리 할당자(memory alllocator) 및 스택관리(stack management)를 포함한 어려 핵심 구성 요소로 구성됩니다. Schedualer Go 런타임의 핵심은 고루틴의 실행을 관리하는 스케줄러입니다. 고루틴은 효율적인 동시성을 가능하게 하는 가벼운 스레드입니다. 스케줄러는 사용 가능한 스레드에 고루틴을 분산하고, 스레드 로컬 스토리지를 관리하고, I/O 작업을 조정하는 역할을 합니다. thread(스레드): 프로그램 내에서 실행되는 흐름의 단위로 동시에 여러 작업이나 프로그램을 실행하는 것입니다. 즉, 코드를 실행할 수 있는 각 단위를 스레드라고 합니다. 고루틴(goroutine): Go 언어로 동시에 실행되는 모든 활동을 의미합니다. 고루틴을 만드는 비용을 스레드에 비해 매우 적기 떄문에 경량 스레드라고 합니다. 모든 프로그램은 적어도 하나의 main() 함수라는 고루틴을 포함하고 고루틴은 항상 백그라운드에서 작동합니다. 메인함수가 종료되면 모든 고루틴은 종료됩니다. 그러므로 고루틴보다 main이 먼저 종료되는 것을 방지해야 합니다. Go 스케줄러는 매우 효율적이고 확장 가능하도록 설계되어 많은 수의 동시 고루틴을 손쉽게 처리할 수 있습니다. 스레드 간에 부하를 분산하여 경합을 최소화하고 성능을 개선하는 작업 훔치기 알고리즘을 사용합니다...

test

기본적으로 사용되는 패키지들과 함수들

import numpy as np
import numpy.linalg as la
from scipy import linalg
from sympy import * 

A

np.all(객체)

  • 객체의 모든 원소가 True 일 경우만 True를 반환
  • 0이 아닌 수는 True

np.allclose(A, B, rtol = 1e−05, atol = 1e−08)

  • 객체 A, B의 모든 원소가 같으면 True, 그렇지 않으면 False를 반환
  • 각 원소값은 상대 임계값(rtol)과 절대 임계값(atol)을 기준
  • rtol과 atol의 기본값은 각각 소수점 이하 5자리 그리고 8자리까지 비교

np.any(객체)

  • 객체 A, B의 모든 원소가 같으면 True, 그렇지 않으면 False를 반환
  • 각 원소값은 상대 임계값(rtol)과 절대 임계값(atol)을 기준
  • rtol과 atol의 기본값은 각각 소수점 이하 5자리 그리고 8자리까지 비교

np.arccos(x)

  • cos 값의 역수를 반환 (y=cos(x) → x=arccos(y))

np.array(x)

  • 객체 x를 배열객체로 반환
  • 객체 x는 파이썬의 기본 자료형인 리스트형
    • 대괄호를 이용하여 값들을 그룹화합니다. Example) [1,2,3], ["a", "b"]등

np.around(M, decimal=0)

  • 배열 객체 각 원소의 반올림을 실행
  • decimal은 반올림 자릿수를 지정하는 것으로서 0이 기본값

C

식.coeff(변수, 차수)

  • 식(sympy 객체)으로부터 지정한 변수와 차수에 대응하는 계수를 반환.

collect(eq, variable)

  • 지정한 변수의 차수를 기준으로 식을 정렬하는 sympy 함수

x1.column_join(x2)

  • 객체 x1과 x2를 열의 방향으로 결합

M.columnspace()

  • 행렬 M의 열공간을 반환

np.concatenate((a,b,c,…), axis=0)

  • 여러 배열 객체들을 결합한 새로운 객체를 생성
  • axis: 결합에 기준이 되는 축 지정
    • 0:열방향(기본값)
    • 1:행방향

np.cos(rad)

  • radian 값에 대응하는 cosin 값을 반환

np.cross(x,y)

  • 벡터 x, y사이에 외적 (cross product)를 반환
  • 벡터 x, y는 행벡터이어야 합니다.

D

pd.DataFrame(객체, index, columns)

  • 객체는 리스트, 사전 형태 등
  • index: 행이름
  • columns: 열이름
  • 함수에서 직접적으로 행과 열이름을 전달할 수 있지만 DataFrame 객체를 생성한 후 다음과 같이 행과 열 이름을 지정할 수 있습니다.
    • DataFrame객체.index: 행이름 지정
    • DataFrame객체.columns: 열이름 지정
  • .values 속성을 사용하여 객체의 값만을 추출하여 numpy 배열형을 변환

np.deg2rad(θ)

  • θ값을 radian값으로 변환(=np.radians(θ))

la.det(M)

  • 행렬 M의 행렬식을 계산

np.diag(values) or np.diag(M, k=0)

  • 인수가 values: 지정한 값들이 대각원소가 되는 대각행렬을 생성.
  • 인수가 M, k
    • 지정된 k에 따른 행렬의 대각 원소를 반환
    • k는 행렬에서 반환할 대각의 위치를 지정
      • k = 0 : 주(main) 대각선(기본값)
      • k > 0 인 정수 : 주 대각선을 기준으로 위쪽으로 이동
      • k < 0 인 정수 : 주 대각선을 기준으로 아래쪽으로 이동

np.dot(a, b)

  • 배열 객체 a, b의 행렬곱을 반환
  • 연산자 "@"와 같음: a@b

E

la.eig(M)

Eq(a, b)

  • a = b의 식을 생성하는 sympy 함수
  • 이 함수는 '=='와 같은 결과를 반환합니다. 즉, 두 식이 동일함을 의미 합니다.
  • solve()함수에 적용은 x−4−3 = 0와 같이 동차 방정식의 형태이어야 합니다. 그러나 Eq() 함수를 사용하여 x−4 = 3와 같은 형태를 적용할 수 있습니다.

np.equal(a, b)

  • 배열 객체 a, b의 원소 단위로 같음을 판단

expand(x)

  • sympy 객체(Equation) x를 전개하는 sympy 함수

np.eye(# of row or column)

  • 배열 객체 a, b의 원소 단위로 같음을 판단

eye(n)

  • n차원의 항등행렬을 생성

H

np.hstack((a, b, c,…))

  • 객체들을 행방향으로 결합 = np.c_[a, b, c,…]

I

numpy.linalg.inv(M)

  • M의 역행렬을 생성
  • scipy.linalg 모듈의 inv() 함수와 동일합니다.

scipy.linalg.linalg.lu(M)

  • 행렬 M의 LU 분해를 실시

M

Matrix(x)

  • 객체 x를 행렬로 변환
  • numpy 배열 객체의 경우 sympy의 행렬 객체로 변환

la.matrix_power(M, k)

  • 행렬 M 에 대해 Mk 를 계산

la.matrix_rank(M)

  • 행렬 M의 급수 (rank)를 반환

N

np.ndim()

  • np 객체인 arr의 차원 반환

la.norm(v, ord=None, axis=None)

  • 벡터 v의 norm을 계산
  • 인수 ord는 norm을 계산하는 방식을 지정하는 것으로 None=Frobenius Norm을 적용(참조)
  • axis: 벡터는 1개의 축을 가지지만 행렬 이상의 객체에서 여러 개의 축들로 표현됩니다. 그러므로 axis를 지정하여 배열 내에 포함되는 각 벡터의 놈을 계산
    • 행렬의 경우 행은 1, 열 0
    • axis 값에서 행이 제일 큰 값, 다음이 열의 순으로 정해짐
    • Example) 3차원 배열의 경우 축은 3개, axis = 2: 행, 1: 열, 0: 나머지 축으로 지정

M.nullspace(x)

  • 객체 M의 영공간(null space)을 반환

P

np.place(x, cond, vals)

  • 객체 x에서 조건(cond)에 해당하는 부분을 지정한 값(vals)로 변환

print()

  • 코드의 결과를 모니터에 출력합니다. 이 함수에 의한 출력은 결과의 내용만을 나타냅니다. 다음의 이 함수를 사용하지 않은 경우와 비교해보면 명확해집니다.
    • a=np.array([3, 1])
      a
    • array([3, 1])
    • print(a)
    • [3 1]
  • sympy 객체는 다음과 같이 latex 방식으로 됩니다.
    • M=Matrix([[3, 1], [2, 4]])
      M
    • appEq1
    • 이 객체는 print()함수에 의해 다음과 같이 표현됩니다.
    • print(M)
    • Matrix([[3, 1], [2, 4]])
    • sympy 객체를 numpy.array 객체로 변환하여 print()함수에 의한 결과는 다음과 같습니다.
    • print(np.array(M))
    • [[3 1]
       [2 4]]

Q

la.qr(M)

  • 행렬 M의 QR 분해하여 Q, R을 튜플로 반환

numpy.prod(x, axis=None)

  • x: 배열객체
  • axis: 축을 지정하는 것으로 .shape 속성 결과의 인덱스와 같음
    • 0:행, 1: 열 등
    • 기본값 None은 모든 요소의 곱을 반환
  • x의 지정한 축(axis)에 따라 요소들의 곱을 반환

R

np.rad2deg(rad)

  • radian값을 θ로 변환

np.radians(θ)

  • θ를 radian값으로 변환

np.random.randint(start, end, size=())

  • a. [시작, 끝-1]의 범위에서 지정한 size의 랜덤수(정수)를 생성
  • size: 결과의 크기와 형태 지정
    • 정수 하나이면 결과를 리스트로 반환.
    • "(행의 수, 열의 수)"와 같이 튜플형식으로 지정할 경우 배열로 반환

Rational(x) 또는 Rational(분자, 분모)

  • 부동소수를 분수로 전환하여 반환하는 sympy 함수
  • 두개의 정수 즉, 분자와 분모를 전달하여 분수를 표현
  • 전달하는 인수를 문자형으로 전환하여 전달
    • Rational('5/3') , Rational(5, 3)
    • (5/3, 5/3)

arr.reshape(# of row, # of column)

  • 원소의 수 = 행의 수 × 열의 수가 성립한다면 배열(벡터 또는 행렬)의 형태를 지정한 행과 열에 따라 재배열
  • 행 또는 열에 특정한 인수가 -1인 경우 다른 인수를 기준으로 차원이 변경됩니다.

round(값, 자릿수)

  • 실수인 값을 지정한 자릿수까지 반올림하는 함수
  • numpy 객체인 배열의 경우 배열.round(자릿수)와 같이 메소드로 사용할 수 있음

x1.row_join(x2)

  • 객체 x1과 x2를 행의 방향으로 결합

x.rref(x)

  • sympy객체 x의 기약행사다리꼴을 생성.
  • 이 함수의 결과는 다음과 같이 터플 형식으로 반환됩니다. (기약행사다리꼴 행렬, column space 열의 번호)

S

numpy.random.seed(seed=None)

  • 랜덤수(난수)를 고정
  • 이 함수의 seed 값(정수)정수를 입력한 후 생성한 랜덤수는 그 seed 값에서 고정됨

arr.shape(# of row, # of column)

  • 객체 arr의 행과 열의 수를 튜플 형식으로 반환

np.sin(rad)

  • radian 값에 대응하는 sin 값을 반환

numpy.linalg.solve()

  • solve(a, b)
    • a·x=b의 방정식에서 미지수 x의 값을 계산
  • solve(expression or matrix)
      solve(A, b),
    • 동차방정식 또는 matrix = 0의 식에 대한 미지수의 해를 계산
    • solve(a, b)의 형태로 위의 la.solve()와 같음
  • 두 함수의 인수는 동차방정식(Equation = 0)의 형태
  • 연립방정식과 같이 여러 개의 식들이 입력될 경우 괄호로 묶어 줍니다.
    • solve((eq1, eq2, ...), (var1, var2,...)
  • 행렬 시스템(선형시스템 참조)의 해를 계산할 수 있습니다.
    • A는 계수행렬, x는 변수벡터, b는 A와 x의 행렬곱에의한 결과벡터인 시스템: Solve(A, b)
    • Appeq2
  • sympy.solve() 함수와 같음

np.sum(객체, axis=None)

  • 객체의 합을 계산합니다.
  • axis에 의해 합을 계산할 축(방향)을 결정.
    • 기본값은 none으로 객체의 내의 모든 값의 합을 계산
    • 행렬의 경우 열 :0, 행 :1
    • 이 순서는 행×열과 같이 객체의 형태를 나타내는 방식에서 오른쪽 부터 0, 1, 2 등을 지정하여 사용.

la.svd(M)

  • 행렬 M의 특이값분해를 실시 → M = UΣVT
  • 정규직교행렬(U), 특이값, 고유행렬의 전치행렬(VT)을 반환
    • ∑: 특이값을 대각 원소로 하는 M과 동일한 차원을 갖는 대각 행렬, 특이값 이외의 부분은 모두 0입니다.

symbols(“symbol(s)”)

  • 기호를 미지수로 지정
  • 수학의 방정식과 같이 기호의 해를 계산할 수 있게 합니다.

T

M.T

  • 행렬 M을 전치시키는 속성
  • 함수 transpose (M)와 같은 결과를 반환

np.transpose(arr, axes=None)

  • 객체 a를 전치시키는 함수
  • 속성 T의 경우 2차원인 행렬에 대해 행과 열을 교환하는데 반해 이 함수는 3 차원 이상의 객체(텐서)의 전치에서 교환할 축을 지정할 수 있습니다.
    • Example를 들어 3차원의 형태가 2 × 3 × 4인 경우를 4 × 2 × 3으로 교환하고자 할 때 다음과 같이 적용합니다.
    • 원 객체의 차원의 인덱스 0, 1, 2는 각각 2, 3, 4의 크기를 가집니다. 이의 전환은 0 → 1, 1 → 2, 2 → 0으로 변환되어야 합니다. 그러므로 명령은 다음과 같습니다.
    • np.transpose(arr, (1, 2, 0))

np.trace(M)

  • 정방행렬 M의 대각원소 들의 합을 계산

np.tril(M, k=0)

  • 행렬 M에서 k에 따른 대각 원소들을 기준으로 위쪽의 원소들을 모두 0으로 변환하여 하삼각행렬 생성
  • 인수 k는 np.diag() 참조

np.triu(M, k=0)

  • 행렬 M에서 k에 따른 대각 원소들을 기준으로 아래쪽의 원소들을 모두 0으로 변환하여 상삼각행렬 생성
  • 인수 k는 np.diag()) 참조

V

np.vstack((a, b, c,…))

  • 객체들을 열방향으로 결합 (= np.r_[a, b, c, …])

댓글