파이썬 오레올레, 이거만 해줘 2021
소개
평소부터 의식해 두고 싶은 테크닉을 간단하게 정리했습니다( ^ω^)
실행 환경편
# mac
# python 3.9.0
pyenv install 3.9.0 # 指定のpython versionをインストール
pyenv virtualenv 3.9.0 py3.9.0 # py3.9.0という仮想環境を構築
pyenv local py3.9.0 # カレントディレクトリ配下ではpy3.9.0の環境を利用する
패키지 관리편
패키지 관리는 재현 가능한 개발 환경을 만드는 데 중요합니다! !
패키지 관리에는 poetry
를 권장합니다.
Poetry는 Python에서 종속성 관리 및 패키징을 위한 도구입니다. Poetry를 사용하면 프로젝트가 의존하는 라이브러리를 선언할 수 있으며 이를 관리(설치 및 업데이트)할 수 있습니다.
# mac
# python 3.9.0
pyenv install 3.9.0 # 指定のpython versionをインストール
pyenv virtualenv 3.9.0 py3.9.0 # py3.9.0という仮想環境を構築
pyenv local py3.9.0 # カレントディレクトリ配下ではpy3.9.0の環境を利用する
패키지 관리편
패키지 관리는 재현 가능한 개발 환경을 만드는 데 중요합니다! !
패키지 관리에는 poetry
를 권장합니다.
Poetry는 Python에서 종속성 관리 및 패키징을 위한 도구입니다. Poetry를 사용하면 프로젝트가 의존하는 라이브러리를 선언할 수 있으며 이를 관리(설치 및 업데이트)할 수 있습니다.
이것만 기억하자.
pip install poetry==1.1.4 # 仮想環境にpoetryをインストール
poetry init # pyproject.tomlを生成
poetry add numpy=1.19.5 # ライブラリのインストール
poetry add black -D # 開発用ライブラリのインストール
poetry remove numpy # ライブラリの削除
poetry install # pyproject.tomlを元に、環境を再現する
👇 같은 파일이 생성되어 자동으로 패키지 관리를 해줍니다! !
pyproject.toml
[tool.poetry]
name = "3.9"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]
[tool.poetry.dependencies] # インストールしたライブラリが記述されます
python = "^3.9"
numpy = "1.19.5"
[tool.poetry.dev-dependencies] # 開発用のライブラリが記述されます
black = "^20.8b1"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
poetry.lock
依存環境が自動的に記載されます
코드 포맷터 편
간편하게 깨끗한 코드를 쓸 수 있는 환경을 손에 넣자! !
Flake8
mypy
블랙
Python 3.6.0
이상 대응 isort
import numpy
등의 패키지를 정렬해 준다(👇의 순서)이것만 기억하자.
poetry add flake8 mypy black isort -D
이 도구를 사용하여 실제로 코드를 만들 수 있습니다.
bad.py
import numpy as np
import os
import sys
print(sys.path)
np.random.seed(seed=32)
apple: str = 'リンゴ'
apple = 100
이것만 기억하자.
flake8 bad.py --max-line-length=120 # デフォルトでは、1行の文字数が80と短いので、オプションで変更
# bad.py:2:1: F401 'os' imported but unused ← os、使ってないよ
# bad.py:8:12: W292 no newline at end of file ← ファイルの最後に空行ないよ
mypy bad.py --ignore-missing-imports --check-untyped-defs --no-strict-optional
# bad.py:8: error: Incompatible types in assignment (expression has type "int", variable has type "str")
↑ str型の変数にintを挿入しようとしているよ
# mypyは個人的に鬱陶しいので、緩めの制限にするオプションをつけています
isort bad.py
# Fixing bad.py
black -l120 bad.py
# reformatted bad.py
# All done! ✨ 🍰 ✨
# 1 file reformatted.
good.py
import sys # isortで並び替え
# flake8が怒るので、osは手動で削除
import numpy as np
print(sys.path)
np.random.seed(seed=32)
apple: str = "リンゴ" # blackがダブルクォテーションに自動整形
apple = "100" # mypyが怒るので、文字型を代入するように変更
# blackが空行を自動挿入
그건 그렇고,
Python 3.9
에서 주석을 👇처럼 쓸 수있게되었습니다. 입니다!!)type.py
numbers: list[int] = [1, 2, 3]
mypy type.py
# type.py:1: error: "list" is not subscriptable, use "typing.List" instead
↑ 従来のtyping.Listを使ってね
명명 규칙편
프로그램 고속화편
빨리 할 수 있는 고속화는 해 두고 싶은 것입니다!! (Cython 레벨은 두어 둔다)
이것만 기억하자.⭐️ループ処理: for文 (whileより高速)
⭐️算術演算 : numpy
左ほど高速でした(N=10000000)
np.sum(np.arange(N)) < sum(range(N)) < sum([i for i in range(N)]) < np.sum(range(N))
⭐️リストの初期化 : numpy
np.empty(N) < [0] * N < list(range(N)) < [0 for i in range(N)]
※初期値は自由とする
⭐️appendはできるだけ回避
# 偶数を抽出するロジック
good:X = [i for i in range(N) if i % 2 == 0]
bad: X = []
for i in range(N):
if i % 2 == 0:
X.append(i)
⭐️条件 in を使うときには、集合(set)と比較 (listより超高速)
nums = set(range(N)) ≃ nums = range(N) << nums = list(range(N))
X = [i for i in range(N) if i in nums]
⭐️基本、index指定が最強(key指定よりも)
配列 辞書
num_values[i] < num_dict[i]
※読みやすさとトレードオフ
⭐️pandasでも同様
df = pd.DataFrame(data=range(N), columns=["A"])
df_values = df["A"].values
[df_values[i] for i in range(N)] << [df.iat[i, 0] for i in range(N)], [df.at[i, "A"] for i in range(N)]
⭐️listはlist, numpyはnumpy 下手に混ぜると遅くなる
[num_lists[i] for i in range(N)] < [num_numpy[i] for i in range(N)]
※番外編
⭐️fileを開くなら with句
⭐️辞書にアクセスするなら.get (keyエラーが出そうな場合)
num_dict.get(i, DEFAULT)
⭐️ループ処理: for文 (whileより高速)
⭐️算術演算 : numpy
左ほど高速でした(N=10000000)
np.sum(np.arange(N)) < sum(range(N)) < sum([i for i in range(N)]) < np.sum(range(N))
⭐️リストの初期化 : numpy
np.empty(N) < [0] * N < list(range(N)) < [0 for i in range(N)]
※初期値は自由とする
⭐️appendはできるだけ回避
# 偶数を抽出するロジック
good:X = [i for i in range(N) if i % 2 == 0]
bad: X = []
for i in range(N):
if i % 2 == 0:
X.append(i)
⭐️条件 in を使うときには、集合(set)と比較 (listより超高速)
nums = set(range(N)) ≃ nums = range(N) << nums = list(range(N))
X = [i for i in range(N) if i in nums]
⭐️基本、index指定が最強(key指定よりも)
配列 辞書
num_values[i] < num_dict[i]
※読みやすさとトレードオフ
⭐️pandasでも同様
df = pd.DataFrame(data=range(N), columns=["A"])
df_values = df["A"].values
[df_values[i] for i in range(N)] << [df.iat[i, 0] for i in range(N)], [df.at[i, "A"] for i in range(N)]
⭐️listはlist, numpyはnumpy 下手に混ぜると遅くなる
[num_lists[i] for i in range(N)] < [num_numpy[i] for i in range(N)]
※番外編
⭐️fileを開くなら with句
⭐️辞書にアクセスするなら.get (keyエラーが出そうな場合)
num_dict.get(i, DEFAULT)
결론
뭔가 있으면 댓글을 주실 수 있으면 다행입니다 🙏
Reference
이 문제에 관하여(파이썬 오레올레, 이거만 해줘 2021), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shoot16625/items/9eefc6e81b3cf209729b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(파이썬 오레올레, 이거만 해줘 2021), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shoot16625/items/9eefc6e81b3cf209729b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)