Django 코드 성능 최적화 및 Pycharm Profile 사용 상세 설명

머리말
pycharm 은 python 의 상업 적 통합 개발 도구 입 니 다.저 는 python 개발 을 하 는 것 이 좋 은 것 같 습 니 다.django 는 매우 유행 하 는 python 웹 오픈 소스 프레임 워 크 입 니 다.본 고 는 인 스 턴 스 코드 를 통 해 Django 코드 성능 최적화 와 Pycharm Profile 사용 에 관 한 내용 을 소개 하고 참고 학습 을 제공 합 니 다.다음은 더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 한번 해 보도 록 하 겠 습 니 다.
데이터 월 보 를 내 보 내 는 스 크 립 트 입 니 다.원래 10 초 걸 렸 고 최적화 후 1 초 밖 에 걸 리 지 않 았 습 니 다.
Pycharm Profile
최적화 의 첫 번 째 단 계 는 Profile 입 니 다.어디 가 느 린 지 먼저 보 세 요.Pycharm 은 프로필 도 구 를 가지 고 있어 서 편리 합 니 다.
공식 그림 으로 설명해 주세요.

도표 설명:
4.567917.함수 호출 관 계 를 제시 했다빨간색->황록색->녹색,색깔 이 짙 을 수록 시간 이 많이 걸린다4.567917.오른쪽 상단 의'x 숫자'는 함수 호출 횟수 를 나타 낸다
  • Own 은 이 함수 자체 의 시간 을 대표 하고 호출 서브 함 수 를 포함 하지 않 습 니 다.Total 은 하위 함 수 를 호출 하 는 데 걸 리 는 시간 을 포함한다.시간 이 걸 리 는 백분율 도 나 왔 다
  • 4.567917.'jump to source'를 오른쪽 클릭 하여 해당 하 는 소스 코드 로 이동 할 수 있 습 니 다프로필 이 있 으 면 남 은 일 은 하기 쉽다.
    먼저,한 도구 함수 가 9 천 여 번 호출 되 는 것 을 보 았 습 니 다.이 함 수 는 nametupled 를 사용 하여 많은 시간 을 들 였 습 니 다.그래서 nametupled 를 제거 하고 몇 초 동안 시간 을 절약 하 였 습 니 다.
    Django logger 를 열 고 DEBUG 레벨 을 설정 합 니 다.
    계속 Profile 을 보 세 요.시간 은 주로 ORM 에서 데이터 베 이 스 를 조회 합 니 다.
    이 때 Django 자체 의 logger 를 열 고 DEBUG 로 단 계 를 바 꾸 면 조회 한 SQL 문 구 를 출력 합 니 다.
    질문
    먼저 의식 한 것 은 ORM 조회 의 N+1 문제 다.
    예 를 들 어 Order 표 가 있 는데 안에 외 키 user 가 있 습 니 다.id 는 관련 User 표 입 니 다.
    
    for order in Order.objects.all():
     order.user.id
    이 때 Order.objects.all()은 sql 문 구 를 1 개 만 가지 고 Order 표 자체 의 필드 를 메모리 에 가 져 옵 니 다.연 결 된 외부 키 도 가 져 오지 않 습 니 다.
    우리 order.userid 일 때,추가 sql 조 회 를 실행 하지 않 고,order.user.id 일 때,User 표를 추가 로 조회 합 니 다.
    for 순환 은 N 회 실 행 했 고,추가 sql 은 N 회 조회 했다.그래서 N+1 문제 라 고 합 니 다.
    N+1 을 해결 하 는 방법:
  • id 필드 에 만 사용 하면 userid 대체 user.id
  • select_related。관련 표 도 함께 조회 하 다.select_related 가 인 자 를 전달 하지 않 으 면 모든 외부 키 를 조회 하 는 시 계 를 표시 합 니 다
  • 또 몇 초의 시간 을 절약 했다.
    필요 한 필드 만 조회
    로 그 를 계속 보 니 sql 조회 횟수 가 많이 줄 었 지만 sql 조회 문구 가 길 어서 모든 필드 를 조회 한 것 같 습 니 다.
    그러나 나 는 몇 개의 필드 만 필요 할 때 가 많다.이렇게 모두 알 아내 면 낭비 된다.
    해결 방법:
  • only()。원 하 는 필드 만 조회 합 니 다.Order.objects.only('userid', ‘pay_date', ‘price')
  • annotate()。 가상 필드 를 지정 할 수 있 습 니 다.외부 키 와 연 결 된 시 계 를 작은 필드 에 만 사용 하면 annotate 로 직접 올 수 있 습 니 다.예 를 들 어 User 표 의 realname 필드 를 Order 표 에 user 라 고 부 릅 니 다.realname 가상 필드.그러면 order.user.realname 조회 가 필요 없고 order.user 만 필요 합 니 다.realname 에서 조회 합 니 다.selectrelated 는 user 표 의 모든 필드 를 꺼 냅 니 다.Order.objects.annotate(user_realname=F(‘user__realname'))。또한 F()를 사용 하여 순수 데이터베이스 차원 의 작업 을 표시 합 니 다.python 메모리 로 끌 어 올 려 처리 할 필요 가 없습니다
  • An F() object represents the value of a model field or annotated column. It makes it possible to refer to model field values and perform database operations using them without actually having to pull them out of the database into Python memory.
    이로써 전체 코드 의 실행 시간 을 1.5 초 로 줄 였 다.
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기