programing

2012년 R의 data.table merge보다 python에서 팬더 병합이 더 빠른 이유는 무엇입니까?

goodjava 2023. 6. 4. 22:22

2012년 R의 data.table merge보다 python에서 팬더 병합이 더 빠른 이유는 무엇입니까?

저는 최근에 파이썬용 판다 라이브러리를 발견했는데, 벤치마크에 따르면 매우 빠른 인메모리 병합을 수행합니다.R(내가 분석을 위해 선택한 언어)의 data.table 패키지보다 더 빠릅니다.

왜?pandas보다훨더빠른보다 훨씬 더 .data.table파이썬이 R에 비해 가지고 있는 고유한 속도 이점 때문인가요, 아니면 제가 모르는 절충안이 있나요?내부 및 외부 조인을 수행할 수 있는 방법이 있습니까?data.table.merge(X, Y, all=FALSE)그리고.merge(X, Y, all=TRUE)?

비교

여기 다양한 패키지를 벤치마킹하기 위해 사용되는 R 코드Python 코드가 있습니다.

판다가 더 빠른 이유는 더 나은 알고리즘을 생각해 냈기 때문인데, 벡터화되지 않는 부분에 대한 Python 인터프리터 오버헤드를 피하기 위해 빠른 해시 테이블 구현 - klib C/Cython을 사용하여 매우 신중하게 구현되었습니다.이 알고리즘은 제 프레젠테이션에 자세히 설명되어 있습니다.판다의 디자인과 개발에 대한 내부 고찰.

data.tableR의 전체 포인트이기 때문에 사실 조금 흥미롭습니다.data.table즉, 데이터 선택 및 병합과 같은 작업을 가속화하기 위해 다양한 열에 대해 미리 지정된 인덱스가 포함되어 있습니다.이 경우(데이터베이스 조인) 팬더의 DataFrame에는 병합에 사용되는 사전 계산된 정보가 없습니다. 말하자면 "콜드" 병합입니다.조인 키의 인수 분해 버전을 저장했다면, 인수 분해가 이 알고리즘의 가장 큰 병목 현상이기 때문에 조인 속도가 상당히 빨라졌을 것입니다.

또한 Panda의 DataFrame 내부 설계는 R의 data.frame(내부 배열 목록일 뿐)보다 이러한 종류의 작업에 훨씬 더 적합합니다.

가 웨스발것보건에서 알려진 .data.table고유 문자열(문자열) 수가 큰 경우: 10,000.

있습니까?Rprof()에서 보낸 합니다.sortedmatch(levels(i[[lc]]), levels(x[[rc]])이것은 실제로 결합 자체(알고리즘)가 아니라 예비 단계입니다.

최근에는 키의 문자 열을 허용하는 데 노력을 기울였는데, 이는 R의 자체 글로벌 문자열 해시 테이블과 더 밀접하게 통합하여 문제를 해결해야 합니다. 일부벤결이보고다니습었되미과는크치에 의해 되었습니다.test.data.table()하지만 그 코드는 아직 연결되지 않았습니다. 레벨과 레벨이 일치하는 것을 대체할 수 없습니다.

판다들은 더 빨리 합쳐집니다.data.table정규 정수 열의 경우?그것은 알고리즘 자체와 요인 문제를 분리하는 방법이 될 것입니다.

또한.data.table시계열 병합을 염두에 두고 있습니다.이에 대한 두 가지 측면: i) (id, datetime) ii와 같은 다중 열 순서 키) 빠른 일반 조인(roll=TRUE 마지막 관찰이 진행되었습니다.

과의 비교는 처음이라 확인할 시간이 필요할 것 같습니다.data.table제시한 바와 같이


data.table v1.8.0에서 업데이트 버전 2012년 7월 출시

  • i 수준을 'factor' 유형의 열에 대해 x 수준으로 일치시킬 때 내부 함수 정렬 match()가 제거되고 chmatch()로 대체되었습니다.이 예비 단계는 요인 열의 수준 수가 많을 때(예: 10,000 이상) 상당한 속도 저하를 초래했습니다.Wes McKinney(Python 패키지 Pandas의 저자)가 입증한 것처럼 4개의 열을 결합하는 테스트에서 악화되었습니다.예를 들어, 600,000개가 고유한 100만 개의 문자열을 일치시키는 것은 16초에서 0.5초로 줄어듭니다.

또한 해당 릴리스에서는 다음과 같습니다.

  • 이제 문자 열은 키에서 허용되며 factor.data.table() 및 setkey()에서 더 이상 문자를 factor로 강제하지 않습니다.요인은 여전히 지원됩니다.FR#1493, FR#1224 및 (부분적으로) FR#951을 구현합니다.

  • 새 함수 chmatch() 및 %chin, match()의 빠른 버전 및 문자 벡터의 %in%.R의 내부 문자열 캐시가 사용됩니다(해시 테이블이 구축되지 않음).이들은 ?chmatch의 예제에서 match()보다 약 4배 더 빠릅니다.

2013년 9월 현재 data.table은 CRAN의 v1.8.10이며 v1.9.0에 대해 연구하고 있습니다. NEWS는 라이브로 업데이트됩니다.


하지만 제가 원래 썼듯이, 위에는:

data.table시계열 병합을 염두에 두고 있습니다.이에 대한 두 가지 측면: i) (id, datetime) ii와 같은 다중 열 순서 키) 빠른 일반 조인(roll=TRUE 마지막 관찰이 진행되었습니다.

따라서 두 개의 문자 열의 Pandas equi 결합은 여전히 data.table보다 빠를 수 있습니다.결합된 두 개의 열을 해시하는 것처럼 들리기 때문에 data.table은 일반적인 순서 조인을 염두에 두고 있기 때문에 키를 해시하지 않습니다.data.table의 "key"는 문자 그대로 정렬 순서입니다(SQL의 클러스터된 인덱스와 유사). 즉, RAM에서 데이터를 정렬하는 방식입니다.목록에는 보조 키를 추가하는 것이 있습니다.

요약하자면, 10,000개 이상의 고유 문자열이 있는 이 2자 열 테스트에서 강조된 눈에 띄는 속도 차이는 알려진 문제가 해결되었으므로 지금만큼 심각하지 않을 것입니다.

이 주제는 2년 전의 것이지만 사람들이 판다와 데이터의 비교를 검색할 때 착륙할 가능성이 있는 장소로 보입니다.표

이 두 가지 모두 시간이 지남에 따라 발전했기 때문에 관심 있는 사용자를 위해 2014년부터 비교한 비교 자료를 여기에 게시하고 싶습니다. https://github.com/Rdatatable/data.table/wiki/Benchmarks-:-Grouping

Wes 및/또는 Matt(참고로, 각각 Panda 및 data.table의 제작자이며 위에서 언급한 바 있음)도 여기에 추가할 뉴스가 있는지 여부를 알면 흥미로울 것입니다.

업데이트 --

jangorecki가 아래에 게시한 댓글에는 매우 유용하다고 생각되는 링크가 포함되어 있습니다: https://github.com/szilard/benchm-databases

https://github.com/szilard/benchm-databases/blob/master/plot.png

이 그래프는 다양한 기술에 대한 집계 및 조인 작업의 평균 시간을 보여줍니다(낮음 = 빠름, 비교가 2016년 9월에 마지막으로 업데이트됨).그것은 저에게 정말 교육적이었습니다.

다시 질문으로 돌아가서,R DT key그리고.R DTR의 data.table의 키드/키드되지 않은 맛을 참조하여 이 벤치마크에서 Python의 Pandas보다 빠릅니다.Py pandas).

두 가지 도구의 저자들이 질문하는 것과 같은 훌륭한 답변들이 있습니다.Matt의 답변은 질문에 보고된 사례를 설명합니다. 이는 병합 알고리즘이 아니라 버그로 인해 발생한 것입니다.버그는 이미 7년 이상 전인 다음 날에 수정되었습니다.

제 답변에서 data.table과 panda의 병합 작업에 대한 몇 가지 최신 타이밍을 제공하겠습니다.플라이어 및 기본 R 병합은 포함되지 않습니다.

제가 발표하는 타이밍은 지속적으로 실행되는 재현 가능한 벤치마크인 db-benchmark 프로젝트에서 나온 것입니다.도구를 최신 버전으로 업그레이드하고 벤치마크 스크립트를 다시 실행합니다.다른 많은 소프트웨어 솔루션을 실행합니다.Spark, Dask 및 소수의 사람들이 관심이 있다면 링크를 확인하십시오.


지금으로선...(아직 구현되지 않은 데이터 크기 1개, 질문 5개 추가)

우리는 LHS 표의 두 가지 데이터 크기를 테스트합니다.
각 데이터 크기에 대해 5가지 병합 질문을 실행합니다.

q1: LHS 내부 결합 RHS-정수일 경우 소형
에서 LHS : LHS 자체 RHS-medium
q3: LHS 외부 결합 RHS-정수의 중간
q4: LHS 내측 접합 RHS-중간 온팩터(범주형)
q5: LHS 내부 결합 RHS-정수에서 빅

RHS 테이블은 3가지 다양한 크기입니다.

  • LHS/1e6 크기로 환산하면 작은
  • 미디엄은 LHS/1e3의 크기로 변환됩니다.
  • LHS 크기로 환산한 big

모든 경우 LHS와 RHS 사이에는 일치하는 행이 약 90% 있으며, RHS 접합 열에 중복되는 행이 없습니다(데카르트 제품 없음).


현재(2019년 11월 2일에 실행)

0.25.3 11월 1일 0.3 2019년 11월 1일 출시
7 ( 11월 data.table 0.12.7 (92abb70) 2019년 11월 2일 공개

아래 시간은 두 개의 서로 다른 LHS 데이터 크기에 대한 초 단위입니다. 기.pd2dt판다가 data.table보다 느린 횟수에 대한 필드 저장 비율이 추가되었습니다.

  • 0.5GB LHS 데이터
+-----------+--------------+----------+--------+
| question  |  data.table  |  pandas  |  pd2dt |
+-----------+--------------+----------+--------+
| q1        |        0.51  |    3.60  |      7 |
| q2        |        0.50  |    7.37  |     14 |
| q3        |        0.90  |    4.82  |      5 |
| q4        |        0.47  |    5.86  |     12 |
| q5        |        2.55  |   54.10  |     21 |
+-----------+--------------+----------+--------+
  • 5GB LHS 데이터
+-----------+--------------+----------+--------+
| question  |  data.table  |  pandas  |  pd2dt |
+-----------+--------------+----------+--------+
| q1        |        6.32  |    89.0  |     14 |
| q2        |        5.72  |   108.0  |     18 |
| q3        |       11.00  |    56.9  |      5 |
| q4        |        5.57  |    90.1  |     16 |
| q5        |       30.70  |   731.0  |     23 |
+-----------+--------------+----------+--------+

언급URL : https://stackoverflow.com/questions/8991709/why-were-pandas-merges-in-python-faster-than-data-table-merges-in-r-in-2012