Pandas 가속 코드 사용 방지 for 순환

머리말
Pandas dataframe 을 사용 하여 수천,심지어 수백 만 번 의 계산 을 실행 하 는 것 은 여전히 도전 이다.데 이 터 를 간단하게 넣 을 수 없습니다.Python for 순환 을 작성 하고 합 리 적 인 시간 안에 데 이 터 를 처리 하 기 를 바 랍 니 다.
Pandas 는 전체 줄 이나 열의 벡터 화 작업 을 한꺼번에 처리 하기 위해 디자인 된 것 으로 모든 셀,줄 또는 열 을 순환 하 는 것 은 디자인 용도 가 아 닙 니 다.따라서 Pandas 를 사용 할 때 고도 로 병행 가능 한 행렬 연산 을 고려 해 야 한다.
본 고 는 Pandas 디자인 을 어떻게 사용 하 는 지 가르쳐 주 고 행렬 연산 에 따라 생각 할 것 이다.이 과정 에서 우 리 는 당신 에 게 시간 을 절약 하 는 실 용적 인 기교 와 요령 을 보 여 줄 것 입 니 다.이런 기교 와 기 교 는 당신 의 Pandas 코드 를 무 서운 Python for 순환 보다 빨리 운행 하 게 할 것 입 니 다!
데이터 준비
본 논문 에서 우 리 는 전형 적 인 아이 리 스 데이터 세트 를 사용 할 것 이다.

이제 표준 선 을 만들어 Python for 순환 으로 우리 의 속 도 를 측정 합 니 다.우 리 는 데이터 세트 에서 실행 할 계산 을 순환 적 으로 옮 겨 다 니 며 전체 작업 의 속 도 를 측정 할 것 이다.이것 은 우리 의 새로운 최적화 가 우리 에 게 얼마나 큰 도움 이 되 는 지 알 기 위해 기준 을 제공 할 것 이다.

위의 코드 에서 우 리 는 기본 함 수 를 만 들 었 습 니 다.If-Else 문 구 를 사용 하여 꽃잎 길이 에 따라 꽃 종 류 를 선택 합 니 다.우 리 는 for 순환 을 만 들 었 습 니 다.순환 dataframe 을 통 해 모든 줄 에 함 수 를 적용 한 다음 순환 의 총 시간 을 측정 합 니 다.
i7-8700k 컴퓨터 에서 5 회 순환 운행 하 는 데 평균 0.01345 초가 걸린다.
사용.interrows()
우리 가 할 수 있 는 가장 간단 하지만 매우 가치 있 는 속 도 는 Pandas 의 내장.iterows()함 수 를 사용 하 는 것 이다.
이전 절 에서 for 순환 을 작성 할 때 range()함 수 를 사 용 했 습 니 다.그러나 우리 가 Python 에서 넓 은 범위 의 값 을 순환 할 때 생 성 기 는 훨씬 빠르다.
Pandas 의.iterows()함수 가 내부 에서 생 성기 함 수 를 실 현 했 습 니 다.이 함 수 는 매번 교체 할 때마다 Dataframe 한 줄 을 생 성 합 니 다.더 정확히 말 하면,.interrows()는 DataFrame 의 모든 줄 에(index,Series)의 쌍(원 그룹)을 생 성 합 니 다.이것 은 실제 적 으로 원시 Python 에서 enumerate()같은 것 을 사용 하 는 것 과 같 지만 운행 속도 가 훨씬 빠르다!
생 성기(Generators)
생 성기 함 수 는 교체 기 와 같은 행동 을 하 는 함 수 를 설명 할 수 있 습 니 다.즉,for 순환 에서 사용 할 수 있 습 니 다.이것 은 코드 를 크게 간소화 하고 간단 한 for 순환 보다 메모 리 를 절약 합 니 다.
이런 예 를 고려 하여 우 리 는 1 에서 1000 사이 의 모든 숫자 를 더 하고 싶다.다음 코드 의 첫 부분 은 for 순환 을 어떻게 사용 하여 이 점 을 실현 하 는 지 설명 한다.
만약 목록 이 매우 작다 면,예 를 들 어 길이 가 1000 이 라면,아주 좋 을 것 이다.거대 한 목록 을 처리 하려 고 할 때,예 를 들 어 10 억 개의 부동 소수점 등 문제 가 발생 한다.for 순환 을 사용 하여 메모리 에 대량의 메모리 huge 목록 을 만 들 었 습 니 다.모든 사람 이 무한 한 RAM 을 가지 고 이런 물건 을 저장 하 는 것 은 아 닙 니 다!Python 의 range()함수 도 같은 일 을 합 니 다.메모리 에 목록 을 만 듭 니 다.
코드 의 제(2)절 은 Python 생 성 기 를 사용 하여 숫자 목록 에 대한 합 의 를 보 여 줍 니 다.생 성 기 는 요 소 를 만 들 고 필요 할 때 만 메모리 에 저장 합 니 다.한 번,한 번.10 억 개의 부동 소수점 을 만들어 야 한다 면 한 번 에 메모리 에 저장 할 수 밖 에 없다 는 뜻 이다.Python 의 xrange()함 수 는 생 성 기 를 사용 하여 목록 을 구축 합 니 다.
즉,여러 번 목록 을 교체 하고 메모리 에 적응 하기 위해 충분 한 크기 를 원한 다 면 for 순환 과 range 함 수 를 사용 하 는 것 이 좋 습 니 다.이것 은 list 값 에 접근 할 때마다 생 성기 와 xrange 가 다시 생 성 되 고 range 는 정적 목록 이 며 메모리 에 빠 른 접근 을 위해 정수 가 존재 하기 때 문 입 니 다.

일반적인 for 순환 대신 코드 를 수정 하 였 습 니 다.내 가 지난 테스트 에 사용 한 같은 기계 에서 평균 운행 시간 은 0.005892 초 이 고 속 도 는 2.28 배 올 랐 다!

.apply()사용 하기
iterrows()함수 가 속 도 를 크게 높 였 지만 우 리 는 아직 완성 하지 못 했다.벡터 로 설 계 된 라 이브 러 리 를 사용 할 때 for 순환 이 전혀 없 는 상태 에서 가장 효과적으로 임 무 를 수행 할 수 있 는 방법 이 있 을 수 있다 는 것 을 항상 기억 하 세 요.
이 기능 을 제공 하 는 Pandas 기능 은.apply()함수 입 니 다.apply()함 수 는 다른 함 수 를 입력 으로 받 아들 이 고 DataFrame 의 축(줄,열 등)을 따라 응용 합 니 다.함 수 를 전달 하 는 상황 에서 람 다 는 보통 모든 내용 을 편리 하 게 포장 할 수 있다.
아래 코드 에서,우 리 는 이미.apply()와 lambda 함수 로 for 순환 을 바 꾸 었 고,포장 에 필요 한 계산 을 완전히 바 꾸 었 다.이 코드 의 평균 운행 시간 은 0.0020897 초 로 원래 의 for 순환 보다 6.44 배 빠르다.

apply()가 훨씬 빠 른 이 유 는 내부 에서 Cython 교체 기 를 옮 겨 다 니 려 고 시도 하기 때문이다.만약 당신 의 함수 가 Cython 에 최적화 되 었 다 면,.apply()는 당신 의 속 도 를 더욱 빠르게 할 것 입 니 다.추가 적 인 장점 은 내장 함 수 를 사용 하면 더욱 깨끗 하고 읽 을 수 있 는 코드 를 만 들 수 있다 는 것 이다!
마지막.
앞에서 말 했 듯 이 만약 당신 이 양 적 조작 을 위 한 라 이브 러 리 를 사용 하고 있다 면,당신 은 항상 for 순환 이 없 는 상황 에서 어떤 계산 도 할 방법 을 찾 아야 합 니 다.
이와 유사 하 게 이런 방식 으로 디자인 된 많은 라 이브 러 리 는 Pandas 를 포함 하여 편리 한 내장 함 수 를 가지 고 있 으 며,당신 이 찾 고 있 는 정확 한 계산 을 실행 할 수 있 으 나 속도 가 빠르다.
Pandas 의.cut()함 수 는 빈 그룹 을 입력 으로 정의 합 니 다.이 빈 들 은 If-Else 의 모든 범위 와 탭 을 정의 합 니 다.이것 은 우리 와 computeclass()함수 가 수 동 으로 작 성 된 것 은 똑 같은 동작 입 니 다.
아래 코드 를 보고.cut()가 어떻게 일 하 는 지 보 세 요.우 리 는 다시 한 번 더 깨끗 하고 읽 을 수 있 는 코드 를 얻 었 다.마지막 으로.cut()함 수 는 평균 0.001423 초 를 운행 하여 원래 의 for 순환 보다 9.39 배 빠 릅 니 다!

자,여기 서 Pandas 가속 코드 의 for 순환 사용 을 피 하 는 글 을 소개 합 니 다.Pandas for 순환 에 관 한 더 많은 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기