파이썬 오레올레, 이거만 해줘 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를 사용하면 프로젝트가 의존하는 라이브러리를 선언할 수 있으며 이를 관리(설치 및 업데이트)할 수 있습니다.
  • htps : // 기주 b. 코 m / py 텐 - Poe try / Poe try
  • htps : // m / sk 217 / ms / 43c994640f4843 a 18d

  • 이것만 기억하자.
    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
    依存環境が自動的に記載されます
    

    코드 포맷터 편



    간편하게 깨끗한 코드를 쓸 수 있는 환경을 손에 넣자! !
  • linter : 코드 작성이 좋지 않은 부분을 확인하는 것

  • Flake8
  • PEP8에 따른 코드 스타일 확인
  • 코드의 논리적 오류 등도 확인


  • mypy
  • 정적형 체크를 해 준다
  • e.g. mypy : "int 형의 변수에 캐릭터 라인을 대입한다!!"


  • 코드 포맷터:코드를 자동 성형해 주는 것

  • 블랙
  • 코드 전체의 스타일 성형을 해 준다
  • 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を使ってね
    
  • htps : // m/k 9700/ms/d5df9d36147796c86c77

  • 명명 규칙편


  • htps : // 코 m / 나오미 7325 / ms / 4 에 b1d2 아 40277361 에 898b

  • 프로그램 고속화편



    빨리 할 수 ​​있는 고속화는 해 두고 싶은 것입니다!! (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)
    
    
  • htps : // 이 m / 소름 끼치고 / ms / c36 아 532 바 6487 d3 d 바
  • h tps : // py 텐구이데ー. Red d. cs. 이오 / 엔 / 아 st /

  • 결론



    뭔가 있으면 댓글을 주실 수 있으면 다행입니다 🙏

    좋은 웹페이지 즐겨찾기