220805 Python 동시성 & 병렬성 프로그래밍

파이썬의 멀티 스레딩(동시성)


venv 명령어

1
2
3
$python -m venv venv # venv이름으로 가상환경 생성
$source venv/bin/activate # 가상환경 활성화 시키기
$deactivate # 가상환경 나가기

pip 명령어

pip는 Python의 패키지 매니저로, 외부 패키지나 라이브러리, 프레임워크를 설치하고 관리할 수 있도록 도와준다.

1
2
3
4
5
6
$pip install pip --upgrade # pip upgrade
$pip install "package~=3.0.0" #3.0.0 version의 패키지를 설치
$pip install [package] # package 설치
$pip uninstall [package] # package 삭제
$pip --version # 설치된 pip version을 확인할 수 있다.
$pip freeze # 설치된 패키지를 확인할 수 있다.

설치된 페키지를 text로 보내고 설치하기(협업)

1
2
$pip freeze > requirements.txt # requirements.txt 파일에 설치된 패키지 리스트를 파일로 뽑아내기
$pip install -r requirements.txt # requirements.txt파일에 기록된 패키지를 설치
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# python version: 3.8.1

autopep8==1.6.0
click==8.1.3
flake8==5.0.4
importlib-metadata==4.12.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
mccabe==0.7.0
pycodestyle==2.9.1
pyflakes==2.5.0
toml==0.10.2
Werkzeug==2.2.1
zipp==3.8.1

CPU 바운드, I/O 바운드, Blocking

바운드

바운드란 장애물에 막혀서 실행이 되지 않는 상태를 말한다.

CPU 바운드

프로그램이 실행될 때 실행속도가 CPU 속도에 의해 제한되는 것을 말하며, 복잡한 수학 수식을 계산하는 경우, CPU의 연산 작업에 의해 프로그램이 실행될때 실행속도가 느려지거나 멈춰있는 되는 현상이 발생하게 되는데, 이를 CPU 바운드라고 한다.

I/O 바운드

프로그램이 실행될 때 실행속도가 I/O에 의해 제한되는 것을 말하며, 프로그램에서 사용자의 입력을 기다리기 위해 프로그램이 멈춰있는 경우가 발생하는데, 이를 I/0 바운드라고 한다.

Network I/O 바운드

사용자로부터 입력을 기다리기 위해 프로그램이 멈추는 것이 아닌, 외부 서버에 요청을 하여 응답을 기다리는 경우에도 프롤그램이 멈춰있는 현상이 발생하는데, 이를 Network I/O 바운드라고 한다.

Blocking

바운드에 의해 코드가 멈추게 되는 현상이 일어나는 것을 블로킹이라고 한다.

Read more

220607 프로그래머스 코딩 테스트 커뮤러닝 참여 중 배운 유익한 내용 (1주차) (업데이트 중...)

알고리즘 문제풀이
이번 포스팅에는 프로그래머스 코딩 테스트 커뮤러닝에 참여하면서 1주차 문제풀이를 통해 다른 사람의 코드와 강사님의 문제풀이를 보면서 배웠던 내용에 대해서 정리해보려고 한다. 나중에 코딩 테스트 보기 전에 한 번 블로그에 정리한 포스팅 내용을 한 번 읽어보면서 정리하기 위한 목적에서 정리를 해본다.

collections의 Counter 활용

여지까지 리스트내의 값을 key:value(등장 횟수) 형태인 dictionary 자료형으로 만들때 일일이 for문으로 순회를 하면서 value 값을 증가 시켜주었는데, 이번 커뮤러닝을 통해 참여하신 분 중 한 분이 내 코드에 리뷰를 해주셨는데, collections의 Counter를 활용하면 더 간결하게 코드를 작성할 수 있다고 해서 코드를 다시 작성해보았는데, 리뷰해주신 내용대로 코드가 훨씬 간결해졌다.

Read more

220502 코딩 테스트 문제 리스트 Web crawling해보기

Web crawling

이번 포스팅에서는 코테준비를 하기 위해서 코테문제를 풀다가 집중도 안되고, 원래 체크리스트를 만들어 놓고 하나씩 지워나가면서 하면 뭔가 성취감도 느끼고 해서 프로그래머스의 연습문제 페이지에 있는 문제 리스트를 Selenium + BeautifulSoup + Pandas + Python의 조합으로 빠르게 크롤링을 해서 엑셀파일로 뽑아보았다.

Read more

220328 Python TIL

Python

파이썬 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Movie:

def __init__(self, name, actor, review, score):
self.name = name
self.actor = actor
self.review = review
self.score = score

def update(self, name, actor, review, score):
self.name = name
self.actor = actor
self.review = review
self.score = score

def all(self):
print("제목: {}\n배우: {}\n리뷰: {}\n별점: {}".format(self.name, self.actor, self.review, self.score))

패터슨 = Movie('패터슨', '아담 드라이버', '아하!', 4.5)
지구를지켜라 = Movie('지구를 지켜라', '신하균', '7번 봤다 더 말이 필요한가', 5)
헤드윅 = Movie('헤드윅', '존 카메론 미첼', '위키드 리틀 타운', 4)

for a in (지구를지켜라, 헤드윅, 패터슨):
a.all()
print('-----------')

# update method 이용하여 가장 마지막 영화의 제목 뒤에 2를 넣어 수정
패터슨.update('패터슨2', '아담 드라이버', '아하!', 5)
패터슨.name

인스턴스 변수의 은닉, 클래스 변수 선언, static method 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Movie:

class_name = 'Movie'

def __init__(self, name, actor, review, score):
self._name = name
self.actor = actor
self.review = review
self.score = score

def update(self, name, actor, review, score):
# _name을 숨겨놓고 조회만 하게 하려면 update method에서 제목 자체를 생략한다.
self.actor = actor
self.review = review
self.score = score

def all(self):
print("제목: {}\n배우: {}\n리뷰: {}\n별점: {}".format(self.name, self.actor, self.review, self.score))

# 파이썬에서 은닉성을 만들기 위해 - 함수를 이용해서 변수명인척 숨어있는 변수를 호출하는 능(볼 수만 있고, 해당 변수명은 알 수 없으며 수정도 할 수 없음.)
@property
def out_name(self):
return self._name

@staticmethod
def staticMovie():
print(Movie.class_name)

@classmethod
def staticMovie(cls):
print(cls.class_name)
Read more

210219 [PyenvError] Pyenv BUILD FAILED ERROR


Pyenv로 새로운 Python version 설치시에 BUILD FAILED 에러 발생

이번에 프로젝트를 진행할때에는 Pyenv를 사용해서 프로젝트별로 파이썬 버전을 다르게 적용하고, Virtualenv로 별도의 가상환경을 구축하여 진행하였다. 문제가 발생한 시점은 Pyenv로 사용할 파이썬 버전을 설치하려고 하는데 아래와 같은 BUILD FAILED에러가 발생하였다.

문제(Issue)

Read more

210217 Python TIL (작성중...)

Python

네트워크

Web scraping 실습하기

  • 환경설정

    1. requests, beautifulsoup4, lxml, jupyter 설치하기
    1
    2
    3
    4
    $ poetry add requests
    $ poetry add beautifulsoup4
    $ poetry add lxml
    $ poetry add —dev jupiter
    1. jupyter notebook 환경에서 requests를 사용해서 Web Scrapping하기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import requests

    url = 'https://api.kurly.com/v2/categories?ver=1'
    response = requests.get(url)
    response
    # response data를 json 형태로 변환하기
    response.json()

    """
    {'data': {'categories': [{'no': '907',
    'name': '채소',
    'show_all_flag': True,
    'pc_icon_url': 'https://img-cf.kurly.com/shop/data/category/icon_veggies_inactive_pc@2x.1586324570.png',
    'icon_url': 'https://img-cf.kurly.com/shop/data/category/icon_veggies_inactive@3x.1586324413.png',
    'pc_icon_active_url': 'https://img-cf.kurly.com/shop/data/
    ...(생략)...
    """
Read more

210215 Python TIL 2/2 - Function, Closure, Decorator

Python

Function = First-class function

  • 파이썬에서는 함수를 일급 시민(first class citizen)으로 취급한다.
    아래의 예시코드를 보면, 함수에서 또 다른 함수를 반환할 수 있으며, 함수에서 반환하는 lambda 함수의 경우 본래 heap에 저장이 되지만, 함수에서 반환된 lambda함수를 변수에 넣음으로써 data 영역에 저장된다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def make_difference(operator):
    if operator == '+':
    return lambda x,y:x+y
    if operator == '-':
    return lambda x,y:x-y

    plus = make_difference('+')
    # lambda는 기본적으로 heap에 저장이 되지만, 변수로 다시 넣기 때문에 데이터의 영역으로 저장이 된다.
    print(plus(1,2)) #3
Read more

210215 Python TIL 1/2 - Module & Package, Library & Framework, Poetry, Virtualenv

Python

Module, Package


  • Module?

    • Python 코드로 이루어진 파일로, 본체에 대한 하위 단위로 정의한다.
  • Package?

    • 관련 여러 모듈들을 하나의 폴더로 묶은 것을 말한다.

    (Module, Package관련 실습내용)
    (1) fibo.py와 main.py 파일을 만들어서 실습을 진행한다.
    fibo에 정의되어있는 text변수의 값을 main.py에서 출력한다.

    1
    2
    3
    from fibo import text

    print(text)
Read more

210214 Python HackerRank Assignment

HackerRank

설날 과제로 강사님이 내주신 HackerRank의 과제에 대해서 정리한다.

문제 1

Problem1 Link(HackerRank)

이 문제는 주어진 클래스의 상속관계를 완성하고, 주어진 조건으로 내부에 method를 완성시키면 되는 간단한 문제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Student(Person):

# Class Constructor
#
# Parameters:
# firstName - A string denoting the Person's first name.
# lastName - A string denoting the Person's last name.
# id - An integer denoting the Person's ID number.
# scores - An array of integers denoting the Person's test scores.
#
# Write your constructor here
def __init__(self, _firstName, _lastName, _id, _scores):
Person.__init__(self, _firstName, _lastName, _id)
self.scores = _scores
# Function Name: calculate
# Return: A character denoting the grade.
#
# Write your function here
def calculate(self):
average = sum(self.scores) / len(self.scores)
if 90 <= average <= 100:
grade = "O"
elif 80 <= average < 90:
grade = "E"
elif 70 <= average < 80:
grade = "A"
elif 55 <= average < 70:
grade = "P"
elif 40 <= average < 55:
grade = "D"
else:
grade = "T"
return grade
Read more

210210 Python TIL 2/2 - class method, instance method, static method, Polymorphism, Abstract class

Python

오늘 배운 내용은 전반적으로 객체지향 프로그래밍 언어로써 Python을 잘 활용하기 위해 중요한 내용이기 때문에 포스팅을 두 개로 나눠서 작성해보았다.

오늘 배운내용

Class, instance, static method

  • Class method: @classmethod decorator를 사용하며, cls를 인자로 사용

    • cls 인자를 받는다.
    • class variable과 연관된 일을 할때 사용이 된다.
  • Instance method: self를 인자로 사용

    -객체의 고유 속성값을 사용한다.
  • Static method: 아무 인자 없이 사용

    • 일반 함수와 같은 역할을 한다.
    • class와 관련있는 함수로써, class내부에서 정의하고자 할 때 사용된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Wallet:
def __init__(self, account):
self.account = account
balance = 0
name = 'Your wallet'

@classmethod
def set_default(cls, amount):
while amount < 1:
print("Err: You should set default value over 1. Try again!")
amount = int(input("Set default value: "))
cls.balance = amount
print('Set default balance to {}'.format(amount))
#instance method
def add_to_account(self, amount):
self.account += amount
print('Your total balance is {}'.format(self.account + Wallet.balance))

@staticmethod
def see_static_name():
print(Wallet.name)

def get_class_name(cls):
print(cls.name)
class MyWallet(Wallet):
name = 'My wallet'
Read more