arr[::], arr[1:2:3], arr[::-1] 등으로 배열의 index에 접근하는 방법을Extended Slices
설명
arr[A:B:C]의 의미는,index A 부터 index B 까지 C의 간격으로 배열을 만들어라는 말입니다. 만약 A가 None 이라면,처음부터라는 뜻이고 B가 None 이라면,할 수 있는 데까지(C가 양수라면 마지막 index까지, C가 음수라면 첫 index까지가 되겠습니다.)라는 뜻입니다. 마지막으로 C가 None 이라면한 칸 간격으로 라는 뜻입니다.
예시
>> arr = range(10)
>> arr
[0,1,2,3,4,5,6,7,8,9]
>> arr[::2] # 처음부터 끝까지 두 칸 간격으로
[0,2,4,6,8]
>> arr[1::2] # index 1 부터 끝까지 두 칸 간격으로
[1,3,5,7,9]
>> arr[::-1] # 처음부터 끝까지 -1칸 간격으로 ( == 역순으로)
[9,8,7,6,5,4,3,2,1,0]
>> arr[::-2] # 처음부터 끝까지 -2칸 간격으로 ( == 역순, 두 칸 간격으로)
[9,7,5,3,1]
>> arr[3::-1] # index 3 부터 끝까지 -1칸 간격으로 ( == 역순으로)
[3,2,1,0]
>> arr[1:6:2] # index 1 부터 index 6 까지 두 칸 간격으로
[1,3,5]
신한·국민·우리·하나 등 4대 은행이 내부 은행원들을 디지털 인력으로 전환하기 위해 도입한 교과목들이다. 지난 1년간 4대 은행이 디지털금융·인공지능(AI)·데이터 분석 석사 등 전문가 과정을 보낸 내부 직원이 총 150여명에 달하는 것으로 집계됐다. 우수 개발인력이 빅테크로 몰리면서 채용이 어려워지자 직접 개발인력을 키우겠다는 것이 은행권의 판단이다.
28일 업계에 따르면 4대 시중은행이 대학원 석사학위 과정이나 전문가과정을 통해 양성하는 디지털 전문인력은 158명으로 집계됐다. 국민은행(2018년)을 시작으로 신한·하나은행(2020년)이 내부 디지털·데이터 교육과정을 잇달아 도입한 결과다. 우리은행은 올초부터 관련 과정을 도입했다. 은행들은 기초지식 수준의 레벨1, 코딩 실습 위주인 레벨2, 인공지능(AI)이나 경영전문대학원(MBA) 등 석사과정 위주의 레벨3로 디지털 연수시스템을 꾸렸다. 각 레벨을 이수해야 다음 레벨을 공부할 수 있는 단계식 교육과정이다.
국민은행은 올해부터 수업마다 과제와 시험을 통과해야 수료할 수 있도록 교육강도가 높아졌다. KB에이스아카데미는 디지털 금융과 데이터 분석 영역에서 각각 1800명, 532명이 사내연수에 도전했다. 하지만 세 차례의 심사와 면접을 거쳐 최종 레벨을 통과한 직원은 2년여동안 12명, 16명에 불과할 정도로 난이도가 높다. 이들 중 20명은 성균관대 GSB AIMBA 과정을 진행 중이고, 나머지 인원은 카이스트 디지털금융MBA 과정을 밟고 있다. 국민은행 관계자는 "올해 해외온라인 석사학위과정인 코세라에 진학할 수 있도록 신규 프로그램을 만들고 있다"고 말했다.
신한은행은 디지털 교육과정에 참여한 인원만 1만3000명에 달한다. 가장 난이도가 높은 ‘디지털 스페셜리스트’(석사)에 참여한 직원은 53명으로 나타났다. 이들은 신한금융이 전 계열사에서 선발하는 고려대 금융공학 및 AI 석사 과정을 통해 위탁교육을 받고 있다. 신한금융 관계자는 "매년 석사과정 경쟁률은 10대 1 수준"이라며 "전 계열사에서 30~34명의 인원을 선발한다"고 말했다.
올해 7월부터는 자격증 취득을 중심으로 하는 디지털 베이직 과정과 외부기관에서 AI·데이터 분석 전공교육을 받는 AI·디지털 챔피언으로 교육 과정을 개편하기로 했다. AI챔피언 과정에는 파이썬과 텐서플로, 신용평가모형 개발 등의 교과목이 들어간다. 최종 관문인 디지털 마스터 과정은 챔피언 과정을 수료한 직원을 대상으로 신설될 예정이다.
하나은행은 총 80여개 과목으로 구성된 'DT유니버시티'를 지난해 6월 도입했다. 1만398명이 레벨1를 수강했는데, 레벨3까지 통과한 인원은 47명이다. 자격증 취득 전문 과정도 따로 꾸렸다. 데이터분석 준전문가(ADsP) 대비반에는 322명, SQLD 대비반에는 200명이 참여한 상태다.
우리은행도 올해부터 전 직원 대상의 디지털 연수 프로그램을 시작했다. 디지털 인사이트(9600명), 디지털 예비인력 양성(800명), 디지털 전문인력(30명) 순으로 난이도가 높다. 디지털 전문인력으로 뽑힌 30명은 카이스트 디지털금융 전문가과정(20명 선발)과 금융-IT 융합 AI·DX과정(10명 선발)에서 4개월간 연수를 받게 된다.
은행 관계자는 "데려올 수 있는 인원이 예전보다 역량이 부족하거나, 전문성 갖춘 개발 인력은 잘 오려고 하지 않는다"며 "내부 인력의 디지털·데이터 분야 전문성 강화에 초점을 맞추는 것이 낫다는 판단에 관련 과정을 확대하고 있다"고 말했다. 이어 "교육 이수 후 바로 퇴사하는 일이 없도록 의무근무기간을 정해 디지털 핵심 부서에서 근무하도록 할 계획"이라고 말했다.
Python은 데이터 과학(DS) 및 기계 학습(ML)에서 가장 많이 사용되는 스크립팅 언어 중 하나입니다.' 프로그래밍 언어의 인기도'에 따르면Python은 Google에서 가장 많이 검색되는 언어입니다.다양한 DS/ML 솔루션을 함께 연결 하는 훌륭한글루언어일 뿐만 아니라 데이터로 거의 모든 작업을 수행할 수 있는 많은 라이브러리가 있습니다.
약 한 달 후에 우리는 Python의 새로운 연간 릴리스: 버전 3.11을 얻습니다.이 버전의 주요 기능은 속도가 크게 향상되었기 때문에 이 새 버전에 대해 매우 흥분됩니다.
LinkedIn에서 나는 이미 새 버전을 테스트하는 두 사람의 게시물을 보았고 그 결과는 놀라웠습니다.그러나 Python 3.11이 진정으로 얼마나 빠른지 느낄 수 있는 가장 좋은 방법은 테스트를 직접 실행하는 것입니다.
이 게시물에서는 Python 3.11에 대한 단계별 분석을 공유합니다.모든 코드는내 github 페이지에서 사용할 수 있습니다 .
프로그래밍 언어를 벤치마킹하는 것은 결코 쉬운 일이 아닙니다.x 가y보다 빠르다는것을 읽을 때항상 결과를 소금 한 알로 받아들여야 합니다.알고리즘의 한 구현은x보다 더 좋을 수 있고 다른 구현은y에서 더 나을 수 있습니다 .벤치마크의 경우 Python에 대해 Python을 테스트할 때 조금 더 간단하지만 약간만 영향을 받는 언어의 요소를 선택했을 수 있습니다.이를 염두에 두고 내가 벤치마킹에 사용한 알고리즘인 Monte Carlo 방법을 사용한 Pi 추정을 제시하고자 합니다.
이 알고리즘의 아이디어는 간단하지만 대학에서 수학 과정에서 처음 보았을 때 마음이 흔들렸습니다.크기가2r 인 정사각형이 있고 이 정사각형에 반지름이r인 원을 맞춥니다.이제 평면에서 숫자를 생성하는 난수 생성기를 사용합니다.<-r, r>, <-r, r>.원에 있는 점과 정사각형에 있는 점 사이의 비율(읽기: 모든 점)은 면적 비율의 근사치로 Pi를 근사하는 데 사용할 수 있습니다.이것은 방정식에서 조금 더 명확합니다.
그림 1: Pi를 추정하기 위한 Monte Carlo 방법의 파생.두 영역 간의 비율은 Pi/4이므로 Pi는 N_circle/N_all의 약 4배입니다.(저자의 이미지).
Python에서는 테스트를 반복하고 평균을 취할 수 있도록 테스트 스크립트에서 실제 추정치를 분할했습니다.여기에 표시되지는 않았지만 명령줄 인터페이스(CLI)에서 인수를 구문 분석하는 표준 라이브러리인Argparse를 사용하여 스크립트를 매개변수화했습니다 .Python 코드는 다음과 같습니다.
def estimate_pi(
n_points: int,
show_estimate: bool,
) -> None:
"""
Simple Monte Carlo Pi estimation calculation.
Parameters
----------
n_points
number of random numbers used to for estimation.
show_estimate
if True, will show the estimation of Pi, otherwise
will not output anything.
"""
within_circle = 0
for _ in range(n_points):
x, y = (random.uniform(-1, 1) for v in range(2))
radius_squared = x**2 + y**2
if radius_squared <= 1:
within_circle += 1
pi_estimate = 4 * within_circle / n_points
if not show_estimate:
print("Final Estimation of Pi=", pi_estimate)
def run_test(
n_points: int,
n_repeats: int,
only_time: bool,
) -> None:
"""
Perform the tests and measure required time.
Parameters
----------
n_points
number of random numbers used to for estimation.
n_repeats
number of times the test is repeated.
only_time
if True will only print the time, otherwise
will also show the Pi estimate and a neat formatted
time.
"""
start_time = time.time()
for _ in range(n_repeats):
estimate_pi(n_points, only_time)
if only_time:
print(f"{(time.time() - start_time)/n_repeats:.4f}")
else:
print(
f"Estimating pi took {(time.time() - start_time)/n_repeats:.4f} seconds per run."
)
view rawsingle_test_run_PARTLY.py hosted with ❤ by GitHub
이 스크립트는 실행할 준비가 되었지만 현재 설치된(또는 활성화된) 버전뿐만 아니라 다양한 버전의 Python을 테스트하는 데 이 스크립트를 사용하려고 합니다.여러 버전의 Python을 테스트하는 가장 쉬운 방법은 Docker를 사용하는 것입니다.Python은많은 도커 이미지를유지 관리 합니다.당연히 모든 버전이 지원되지만 2.7 또는 3.2와 같은 EOL(End-of-Life) 버전도 지원됩니다.버전 3.11과 같은 릴리스 후보에 대한 이미지도 있습니다.Docker를 사용하려면 Docker가 설치되어 있어야 합니다.Linux와 Mac에서는 비교적 쉽습니다. Windows에서는 확실하지 않지만 어렵지는 않을 것입니다.도커 CLI만 설치하는 것이 좋습니다. 데스크탑은 저에게 너무 부풀려져 있습니다.컨테이너화된 Python 환경에서 로컬 스크립트를 실행하려면 다음을 실행하십시오.
다양한 버전에 대한 테스트를 자동화하기 위해 물론 Python도 사용합니다.이 스크립트는 특정 Python 버전으로 컨테이너를 시작하는하위 프로세스를 시작하고 나중에 결과를 수집합니다.특별한 것은 없습니다:
def test_version(image: str) -> float:
"""
Run single_test on Python Docker image.
Parameter
---------
image
full name of the the docker hub Python image.
Returns
-------
run_time
runtime in seconds per test loop.
"""
output = subprocess.run([
'docker',
'run',
'-it',
'--rm',
'-v',
f'{cwd}/{SCRIPT}:/{SCRIPT}',
image,
'python',
f'/{SCRIPT}',
'--n_points',
str(N_POINTS),
'--n_repeats',
str(N_REPEATS),
'--only-time',
],
capture_output=True,
text=True,
)
avg_time = float(output.stdout.strip())
return avg_time
# Get test time for current Python version
base_time = test_version(NEW_IMAGE['image'])
print(f"The new {NEW_IMAGE['name']} took {base_time} seconds per run.\n")
# Compare to previous Python versions
for item in TEST_IMAGES:
ttime = test_version(item['image'])
print(
f"{item['name']} took {ttime} seconds per run."
f"({NEW_IMAGE['name']} is {(ttime / base_time) - 1:.1%} faster)"
)
view rawrun_main_test_py11.py hosted with ❤ by GitHub
이러한 테스트를 실행할 때 절대값은 프로세서(CPU 과중)에 따라 시스템마다 다릅니다.다음은 마지막 7개의 주요 Python 버전에 대한 결과입니다.
벤치마크는 Python 3.11의 경우 평균 6.46초가 소요되었습니다.이를 이전 버전(3.10)과 비교하면 거의 37% 더 빠릅니다.꽤 인상적입니다!버전 3.9와 3.10 간에 거의 동일한 차이가 있어 3.11이 거의 70% 빨라졌습니다!나는 그림 2에서 모든 시간을 플로팅했습니다.
그림 2: 테스트한 모든 Python 버전의 평균 루프 시간.(저자의 이미지).
속도에 대해 이야기할 때 항상 한 사람이 말합니다. 속도를 원하면 C를 사용하지 마십시오.
C는 Python보다 훨씬 빠릅니다!— 그 한 사람
내 C는 녹슬었지만 어쨌든 시도해 볼 생각입니다.좋은 시간 측정 라이브러리(크로노)와 함께 제공되는 GNU C++를 사용했습니다.아래 코드를 찾으십시오.
#include <stdlib.h>
#include <stdio.h>
#include <chrono>
#include <array>
#define N_POINTS 10000000
#define N_REPEATS 10
float estimate_pi(int n_points) {
double x, y, radius_squared, pi;
int within_circle=0;
for (int i=0; i < n_points; i++) {
x = (double)rand() / RAND_MAX;
y = (double)rand() / RAND_MAX;
radius_squared = x*x + y*y;
if (radius_squared <= 1) within_circle++;
}
pi=(double)within_circle/N_POINTS * 4;
return pi;
}
int main() {
double avg_time = 0;
srand(42);
for (int i=0; i < N_REPEATS; i++) {
auto begin = std::chrono::high_resolution_clock::now();
double pi = estimate_pi(N_POINTS);
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
avg_time += elapsed.count() * 1e-9;
printf("Pi is approximately %g and took %.5f seconds to calculate.\n", pi, elapsed.count() * 1e-9);
}
printf("\nEach loop took on average %.5f seconds to calculate.\n", avg_time / N_REPEATS);
}
view rawpi_estimate.c hosted with ❤ by GitHub
우리 모두 알고 있듯이 C++는 컴파일된 언어이므로 소스를 사용하려면 먼저 컴파일해야 합니다.일반이build-essentials설치된 경우 다음을 입력할 수 있습니다.
g++ -o pi_estimate pi_estimate.c
컴파일 후 빌드 실행 파일을 실행하기만 하면 됩니다.출력은 다음과 같아야 합니다.
Pi는 약 3.14227이고 계산하는 데 0.25728초가 걸렸습니다.
Pi는 약 3.14164이고 계산하는 데 0.25558초가 걸렸습니다.
Pi는 약 3.1423이며 계산하는 데 0.25740초가 소요되었습니다.
Pi는 약 3.14108이고 계산하는 데 0.25737초가 걸렸습니다.
Pi는 약 3.14261이며 계산하는 데 0.25664초가 소요되었습니다.각 루프는 계산하는 데 평균 0.25685초가 걸렸습니다.
그리고 우리는 그것이 정말로 (읽기: REALLY) 빠르기 때문에그 한 사람과 동의해야 합니다 .이전에 Python에서 프로그래밍한 것과 동일한 루프를 수행하는 데 0.257초밖에 걸리지 않았습니다.이것을 그림 3과 같이 이전 플롯의 선으로 추가해 보겠습니다.
그림 3: C++로 컴파일된 동일한 벤치마크와 비교한 Python 버전.(저자의 이미지).
이제 이전 수치를 조금 더 오래 감상한 후 Python이 얻은 추진력을 분명히 볼 수 있습니다.버전 3.9 이후로 Python은 속도가 약 35% 증가했습니다.Python 개발자는 다음 몇 가지 버전에서 상당한 속도 증가가 있을 것이라고 언급했으므로 이 속도가 유지될 것이라고 가정할 수 있습니다(예, 매우 안전한 가정).
이제 문제는 이 모멘텀이 고정된 상태에서 Python이 C++의 시간을 언제 능가할 것인가입니다.이를 위해 우리는 물론 외삽을 사용하여 다음 Python 버전의 루프 시간을 예측할 수 있습니다.이는 그림 4에서 볼 수 있습니다.
그림 4: Python 속도 추정 -> Python 3.14는 속도 면에서 C++를 능가합니다.놀라운!(저자의 이미지).
결과는 정말 놀랍습니다!이 속도를 유지하면 Python 3.14가 C++보다 빠를 것입니다.정확히는 루프 시간이-0.232초가 되므로 계산을 하기 직전에 완료됩니다.시공간 연속체에 구멍이 있는 것처럼 보이지만 이러한 계산은 확고합니다.그러므로 우리는 아인슈타인과 친구들의 작업에 의문을 제기해야 할 수도 있다고 생각합니다.