왜 팬더가 2012 년에 data.table이 R보다 빨리 파이썬에서 병합 되었습니까?


160

필자는 최근 파이썬 용 팬더 라이브러리를 보았습니다. 이 벤치 마크 에 따르면 매우 빠른 인 메모리 병합을 수행합니다. R 의 data.table 패키지 보다 훨씬 빠릅니다 (분석을 위해 선택한 언어).

pandas그렇게 빠른 data.table가요? 파이썬이 R에 비해 고유 한 속도 이점 때문입니까, 아니면 알지 못하는 트레이드 오프가 있습니까? 내부 및 외부에 조인을 수행 할 수있는 방법이 있나요 data.table의지하지 않고 merge(X, Y, all=FALSE)와는 merge(X, Y, all=TRUE)?

비교

다음 은 다양한 패키지를 벤치마킹하는 데 사용되는 R 코드Python 코드 입니다.


10
@JoshuaUlrich : IIRC data.table는에서 상속 받지만 data.frame, C 코드에 의존합니다.
digEmAll

4
@Joshua "data.frame을 C로 조작해도 속도가 느리다"는 것은 무엇을 의미합니까? 다른 것과 관련이 있습니까? 그리고 천천히?
Matt Dowle

12
@JoshuaUlrich 방금이 댓글 트레일이 결코 침대에 놓이지 않는 것을 알았습니다. 그래서 그것을 정리하기 위해 : 이 토론 후 곧 set()추가되었습니다 data.table. 루프 될 때 :=의 작은 오버 헤드 와 매우 유사 하지만 피하여 [.data.table결과적으로 속도가 빠릅니다 matrix. 따라서 매트릭스만큼 빠르게 조작 data.frame 할 수 있습니다. 벤치 마크가 여기에 있습니다 .
Matt Dowle

5
이 벤치 마크의 업데이트 버전을 얻을 수 있습니까?이 벤치는 실제로 최첨단이었으며 지금까지 수정되었습니다. 내가 본 모든 벤치 마크에서 data.table이 더 빠름을 보여 주면 병합 번호가 무엇인지 알고 싶습니다.
statquant

3
@statquant 원래 벤치 마크를 실행하지는 않았지만 Wes가 벤치 마크를 업데이트하는 것을 정말로보고 싶습니다.
Zach

답변:


120

Wes가 data.table고유 한 문자열 ( 레벨 ) 의 수가 10,000 인 경우 알려진 문제를 발견 한 것 같습니다 .

Rprof()통화에 소비 된 대부분의 시간을 공개 합니까 sortedmatch(levels(i[[lc]]), levels(x[[rc]])? 이것은 실제로 조인 자체 (알고리즘)가 아니라 예비 단계입니다.

최근에는 키에 문자 열을 허용하려는 노력이있어 왔으며, R의 자체 글로벌 문자열 해시 테이블과 더 밀접하게 통합하여이 문제를 해결해야합니다. 일부 벤치 마크 결과는 이미보고 test.data.table()되었지만 해당 코드는 아직 연결되지 않은 레벨로 대체하기 위해 연결되지 않았습니다.

팬더는 data.table일반 정수 열 보다 빨리 병합 됩니까? 알고리즘 자체와 요인 문제를 분리하는 방법이어야합니다.

또한, data.table시계열 병합 마음을. 그 두 가지 측면 : I) 다중 열 정렬 II) 빠른 (가입 승소) 등 (ID, 날짜 등의 키를 roll=TRUE일명 마지막으로 관찰 이월).

data.table제시된 것과 비교 한 첫 번째 내용이므로 확인하는 데 약간의 시간이 필요합니다 .


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

  • 'factor'유형의 열에 대해 i 레벨을 x 레벨과 일치시킬 때 내부 함수 sortedmatch ()가 제거되고 chmatch ()로 대체되었습니다. 이 예비 단계는 요인 열의 수준 수가 많을 때 (예 :> 10,000) (알려진) 상당한 속도 저하를 유발했습니다. Wes McKinney (Python package Pandas의 저자)가 시연 한 것처럼 4 개의 이러한 열을 결합하는 테스트에서 악화되었습니다. 예를 들어, 60 만 개의 고유 한 백만 개의 문자열이 16에서 0.5로 줄어 듭니다.

또한 그 릴리스에서 :

  • 문자 열은 이제 키로 허용되며 요인을 고려하는 것이 좋습니다. data.table () 및 setkey ()는 더 이상 문자를 고려하지 않습니다. 요소는 여전히 지원됩니다. 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에서 작업하고 있습니다. 뉴스 가 실시간으로 업데이트됩니다.


그러나 내가 원래 쓴 것처럼 위의 :

data.table시계열 병합 마음에. 그 두 가지 측면 : I) 다중 열 정렬 II) 빠른 (가입 승소) 등 (ID, 날짜 등의 키를 roll=TRUE일명 마지막으로 관찰 이월).

따라서 Pandas는 두 개의 문자 열을 동등하게 결합하는 것이 아마도 data.table보다 빠릅니다. 그것이 결합 된 두 개의 열을 해시하는 것처럼 들립니다. data.table은 우선 순위가 높은 조인을 염두에두고 키를 해시하지 않습니다. data.table의 "키"는 문자 그대로 정렬 순서입니다 (SQL의 클러스터형 인덱스와 유사합니다. 즉, 데이터가 RAM에서 정렬되는 방식). 예를 들어 목록에 보조 키를 추가하는 것입니다.

요약하면, 알려진 문제가 해결되었으므로 10,000 개가 넘는 고유 한 문자열을 가진이 특정 2 자 열 테스트에서 강조된 눈부신 속도 차이는 지금 나쁘지 않아야합니다.


6
상당히 크고 현실적인 데이터 세트에 대한 테스트 케이스를 제공하는 경우 벤치 마크를 실행하게되어 기쁩니다. 당신도 환영합니다. 실제로 정수 조인 키 사례에 대한 코드를 아직 최적화하지는 않았지만 (내 todo 목록에 넣으십시오!) 링크 된 프레젠테이션에서 해시 테이블 연구를 고려한 문자열 사례보다 훨씬 더 나은 성능을 기대할 수 있습니다.
Wes McKinney

22
나는이 라이브러리 중 하나를 사용하지 않지만 Matthew Dowle 모양의 R면에서 건설적인 반응을 보게되어 기뻤습니다.
SlowLearner 2018 년

3
다음은 Rprof 결과 pastie.org/3258362 입니다. 결합 유형에 따라 시간의 20-40 %가 정렬 된 일치에 소비되는 것 같습니다. 정수 열을 다시 한 번 살펴 봐야 할 것입니다. 팬더 GitHub 문제를 제기하여 해당 사례를 최적화하도록 상기시켜줍니다 ( github.com/wesm/pandas/issues/682 )
Wes McKinney

14
@AndyHayden 몇 시간 전에 개선되었습니다. 뉴스 항목에서 편집하겠습니다. 우리는 그 알려진 문제에 대해 한 가지 특정 테스트 (2 개의 문자 열을 결합하는 등가)를 선택했습니다. 그가 정수 열을 선택했다면 달라졌을 것입니다. 그리고 그가 회의에서 벤치 마크를 발표하기 전에 나에게 머리를 주었다면, 나는 그에게 알려진 문제에 대해 더 말할 수 있었다.
Matt Dowle

191

팬더가 더 빠른 이유는 더 나은 알고리즘을 생각해 냈기 때문입니다.이 알고리즘은 벡터화 할 수없는 부분에 대한 파이썬 인터프리터 오버 헤드를 피하기 위해 빠른 해시 테이블 구현-klib 및 C / Cython 을 사용하여 매우 신중하게 구현 되었기 때문 입니다. 이 알고리즘은 프리젠 테이션에 자세히 설명되어 있습니다 : 팬더 디자인 및 개발 내부 모습 .

data.tableR의 요점은 데이터 선택 및 병합과 같은 작업을 가속화하기 위해 다양한 열에 대해 사전 계산 된 인덱스data.table 가 포함되어 있기 때문에 비교 는 실제로 약간 흥미 롭습니다 . 이 경우 (데이터베이스 조인) 팬더의 DataFrame에는 병합에 사용되는 미리 계산 된 정보 가 없으므로 "콜드"병합이라고합니다. 인수 분해 버전의 조인 키를 저장 한 경우 인수 분해가이 알고리즘의 가장 큰 병목 현상이므로 결합이 훨씬 빠릅니다.

또한 팬더의 DataFrame의 내부 디자인은 R의 data.frame (내부 배열 목록)보다 이러한 종류의 작업에 훨씬 적합합니다.


76
물론, 이제는 파이썬으로 모든 것을 알아 냈으므로 R로 쉽게 번역 할 수 있어야합니다.)
hadley

37
그러나 왜 누군가가 원했을까요? :)
ely

9
음 ... 어쩌면 R에서 데이터 작업이 더 빨라지기를 원할까요? Just guessing :))
lebatsnok

28
안녕 Wes-- 귀하의 결과는 data.table수정 된 버그에 의해 주도적 인 것으로 보입니다 . 벤치 마크를 다시 실행하고 업데이트 된 블로그 게시물을 작성할 수 있습니까?
Zach

6
Zach는 이것을 확인해야합니다 : github.com/Rdatatable/data.table/wiki/Benchmarks-:-Grouping
Merik

37

이 주제는 2 살이지만 팬더와 데이터 비교를 검색 할 때 사람들이 방문 할 가능성이있는 것 같습니다.

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

Wes 및 / 또는 Matt (각각 Pandas 및 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의 키 입력 / 설정 해제 된 맛을 참조 파이썬의 팬더 이상이 벤치 마크에 빠른 될 일이 ( Py pandas).


1
나는 단지 이것을 게시하려고했다! 추가해 줘서 고맙습니다.
Zach

7
@Zach 이것을 참조하십시오 : github.com/szilard/benchm-databases 그리고 그것도 좋습니다 : speakerdeck.com/szilard/…
jangorecki

1
@Zach 4 년 후 새로운 벤치 마크 결과가 나왔습니다. 아래 답변을 참조하십시오.
jangorecki 2018

7

질문에 대한 두 가지 도구의 저자에 의해 특히 훌륭한 답변이 있습니다. Matt의 답변은 질문에보고 된 경우, 병합 알고리즘이 아닌 버그로 인한 것임을 설명합니다. 7 년 전에 이미 다음 날 버그가 수정되었습니다.

내 대답으로는 data.table 및 pandas에 대한 병합 작업의 최신 타이밍을 제공 할 것입니다. plyr 및 base R merge는 포함되지 않습니다.

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


현재로서는 ... (여전히 구현 : 하나 이상의 데이터 크기와 5 개의 질문이 더 있습니다)

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

q1 : 정수의 LHS 내부 결합 RHS- 소형
q2 : 정수의 LHS 내부 결합 RHS- 중간
q3 : 정수의 LHS 외부 결합 RHS- 중간
q4 : LHS 내부 결합 RHS- 중간 계수 (카테고리)
q5 : LHS 내부 결합 RHS- 정수에

RHS 테이블은 3 가지 크기로 제공됩니다.

  • 작은 크기는 LHS / 1e6의 크기로 변환됩니다
  • 중간 크기는 LHS / 1e3의 크기로 변환됩니다
  • LHS의 크기로 번역

모든 경우에 LHS와 RHS 사이에 일치하는 행의 약 90 %가 있으며 RHS 결합 열에 중복이 없습니다 (직교 곱 없음).


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

2019 년 11 월 1 일에 판다 0.25.3 데이터 2019 년
11 월 2 일에 출시 된 표 0.12.7 (92abb70)

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 |
+-----------+--------------+----------+--------+

향후 업데이트에 감사드립니다! data.table의 R vs python 구현을위한 열을 추가 할 수 있습니까?
Zach

1
R dt vs pandas를 보더라도 웹 사이트를 방문하여 확인하는 것이 좋습니다. 그리고 pyDT는 원래 질문의 일부가 아닙니다.
jangorecki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.