Python 345

2022년 3주차 '기록의 시작'

Weekly Work 이번 주는 기업 협업 3주 차였다. 과제는 '실시간 호가 데이터를 가져오고 DB에 파일 시스템을 활용하여 벌크로 저장하는 것'이었다. 실시간 호가 데이터를 불러오기 위해 스레드를 공부해 추가했다. 결과적으로 데이터는 받아왔지만 뭔가 꺼림칙하다. 코드는 동작하지만 그 동작원리를 알 수 없기 때문이었다. com객체와 thread, message pump가 어떤 원리로 동작하는지 아직 명확하게 이해하지 못했다. 파일 시스템을 이용해 데이터를 모아서 한 번에 저장할 수 있다는 것을 알게 되었다. 처음에 with문이 무슨 역할을 하는지 몰랐으나 파이썬 강의를 추가로 들으면서 close() 메서드 역할이 포함되어 있다는 것을 알게 되었다. 기업 협업이 만족스럽지는 않다. 사실 주어진 과제는 훨..

파이썬 멀티 스레딩

프로세스와 스레드 확인 os.getpid() : 현재 프로세스 아이디(PID)를 반환한다 threading.get_ident() : 현재 스레드의 식별자를 반환한다 print(f"{os.getpid()} process | {threading.get_ident()} url : {url}") 아래 실습 코드를 실행해보고 '싱글 스레드'와 '멀티 스레드'의 결과 값을 비교해보자 # 실습 코드 import requests import time import os import threading from concurrent.futures import ThreadPoolExecutor ''' concurrent.futures 모듈은 비동기적으로 콜러블을 실행하는 고수준 인터페이스를 제공합니다. 비동기 실행은 (Thre..

동시성(병행성) vs 병렬성

동시성(Cuncurrency) 논리적 개념 at the same time (X) 동시성이란 스위칭으로 한 번에 여러 작업을 동시에 다루는 것을 의미 → 싱글 프로세스, 싱글 스레드가 스위칭을 하면서 여러 작업을 수행 → 멀티스레드도 스위칭하며 작업 가능 비유) 하나의 로봇이 왔다 갔다 하며 작업을 수행 (바운드될 때마다 스위칭) 병렬성(Parallelism) 물리적 개념 at the same time (O) 병렬성은 한 번에 여러 작업을 병렬적으로 처리하는 것을 의미 → 멀티 프로세스, 멀티 스레드를 통해 동시에 여러 작업을 수행 → 싱글 스레드는 불가능 비유) 여러 로봇이 동시에 각자 맡은 작업을 수행 유의할 점 동시성과 병렬성은 함께 공존할 수 있다. 예를 들어 병렬적으로 작업을 수행하면서 그 하위에..

파이썬 코루틴 활용

웹사이트 데이터 가져오기 1. session을 통해 url에 접속한다 2. request.get을 통해 데이터를 가져온다 3. session을 닫고 걸린 시간을 측정한다 * session을 간편하게 닫기 위해 with문을 사용했다. with문을 사용하면 with 블록을 벗어나는 순간 자동으로 close되어 편리하다. 4. 일반 코드와 코루틴 코드의 결과를 비교해본다 일반 코드의 경우(동기) >>> 15.04025387763977 초 ''' 동기로 코드를 작성할 경우 15.04025387763977 초 소요 ''' import requests import time def fetcher(session, url): with session.get(url) as response: return response.te..

하샤드 수

문제 설명 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요. 제한 조건 x는 1 이상, 10000 이하인 정수입니다. 입출력 예 설명 입출력 예 #1 10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다. 입출력 예 #2 12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다. 입출력 예 #3 11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다. 입출력 예..

파이썬 코루틴

루틴이란? 일련의 명령 흐름 (코드의 흐름) 메인 루틴 프로그램의 메인 코드의 흐름 서브 루틴 ( = 함수 ) 함수나 메서드 (메인 루틴을 보조하는 역할) 하나의 진입점과 하나의 탈출점이 있는 루틴 코루틴 서브루틴의 일반화된 형태 다양한 진입점과 다양한 탈출점이 있는 루틴 await에 의해 진입과 탈출점이 추가됨 비동기적 코드를 가능하게 함 await 은 어웨이터블 객체 앞에 사용한다 어웨이터블 객체는 코루틴, 태스크 및 퓨처를 의미한다 코루틴 함수 time.sleep() → X asyncio.sleep() → O 함수 정의 시 async 를 붙이는 경우 → O 태스크 객체 태스크를 예약할 때 사용 task1 = asyncio.create_task(func()) await task1 # 이렇식으로 코드 ..

동기 vs 비동기

동기란? 코드가 반드시 작성된 순서로 실행된다 요청 후 응답을 받지 못하면 바운드 상태를 유지한다 이전 요청에 대한 응답을 받아야만 다음 코드를 진행하므로 연산이 느려진다 예) 주문 받은 순서대로 처리한다. 앞선 주문이 완료되지 않으면 다음 주문으로 넘어가지 않는다 비동기란? 코드가 반드시 작성된 순서로 실행되는 것이 아니다 요청 후 응답을 받지 못해도 바운드 없이 다음 코드를 수행한다 이전 요청에 대한 응답을 기다리지 않으므로 동기보다 더 빠르게 연산이 가능하다 예) 주문을 수행하지만 완료되지 않아도 다음 주문을 진행한다 무조건 비동기가 좋을까? 단순한 계산은 비동기로 구현할 경우 코드가 복잡해지고 유지보수가 어려워질 수 있다 다음 단계로 넘어가면 안되는 계산이라면 동기로 구현하자 동기 비동기 비교를 ..

핸드폰 번호 가리기

문제 설명 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요. 제한 조건 s는 길이 4 이상, 20이하인 문자열입니다. 해결 방법 ''' 1. 마지막 요소 4개를 제외한 문자열을 구한다 2. 마지막 요소 4개를 제외한 수만큼 '*'을 만든다 3. 구한 문자열을 '*'문자열로 바꾸어 반환한다 ''' def solution(phone_number): a = phone_number[:-4] b = '*' * len(phone_number[:-4]) return phone_number.replace(a, b) ''' 입력값 〉"027778888" 기댓값 〉"*****8888" ''' 이 ..

행렬의 덧셈

문제 설명 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요. 제한 조건 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다. 해결 방법 1. 최종 리턴할 리스트를 생성한다 2. 내장함수 zip과 for를 이용하여 각 리스트의 요소를 분리한다 3. 반복 시 초기화되는 임시 리스트를 생성한다 4. 다시 각 리스트의 요소를 분리한다 5. 분리된 요소끼리 더한 값을 임시 리스트에 추가한다 6. 최종 리스트에 임시 리스트를 요소로 추가한다 7. 최종 리스트를 반환한다 def solution(arr1, arr2): answer_list ..

Linter 와 Formatter 를 사용해서 깔끔하게 코딩하자

Linter란? 소스 코드를 분석하여 프로그램 오류, 버그, 스타일 오류, 의심스러운 구조체에 표시(flag)를 달아놓기 위한 도구 Formatter란? 작성한 코드에 대해 설정된 규칙에 의해 정렬을 해주는 기능 Linter 와 Formatter 를 사용하면 저장할 때마다 내 코드를 깔끔하게 정리해준다. 또한 혹시나 잘못 작성된 코드가 무엇인지 알기 쉽게 표시해준다. 보통 가상환경 설정 후 저장을 하면 vsc에서 추가 설치를 권장하는 팝업창이 뜨는데 여기서 이러한 도구들을 설치할 수 있다. (물론 직접 pip같은 툴로 설치해도 무방) 추천하는 도구들을 소개하자면 다음과 같다. black 최근 파이썬 커뮤니티에서 가장 널리 쓰이고 있는 있는 코드 포멧터 autopep8 파이썬 코드를 PEP8 컨벤션에 맞게..