Tại sao gấu trúc hợp nhất trong python nhanh hơn so với data.table sáp nhập vào R năm 2012?


160

Gần đây tôi đã đi qua thư viện gấu trúc cho trăn, mà theo tiêu chuẩn này thực hiện việc hợp nhất trong bộ nhớ rất nhanh. Nó thậm chí còn nhanh hơn gói data.table trong R (ngôn ngữ tôi chọn để phân tích).

Tại sao pandasnhanh hơn nhiều data.table? Có phải vì một con trăn lợi thế tốc độ vốn có đã vượt qua R, hoặc có một số sự đánh đổi mà tôi không biết? Có cách nào để thực hiện tham gia bên trong và bên ngoài data.tablemà không cần dùng đến merge(X, Y, all=FALSE)merge(X, Y, all=TRUE)?

So sánh

Đây là mã Rmã Python được sử dụng để điểm chuẩn các gói khác nhau.


10
@JoshuaUlrich: IIRC data.tablechỉ thừa hưởng từ data.frame, nhưng nó dựa vào mã C dưới mui xe.
digEmAll

4
@Joshua Ý bạn là gì khi "data.frames chậm ngay cả khi bạn thao tác chúng trong C"? Điều đó có liên quan đến cái gì khác không? Và chậm ở cái gì?
Matt Dowle

12
@JoshuaUlrich Tôi chỉ nhận thấy dấu vết nhận xét này không bao giờ được đưa vào giường. Vì vậy, để làm rõ nó: set()đã được thêm vào data.tablengay sau cuộc thảo luận này. Rất giống với :=nhưng tránh được chi phí nhỏ [.data.tablekhi được lặp và do đó nhanh như vậy matrix. Do đó, data.frame có thể được thao tác nhanh như ma trận. Điểm chuẩn là đây .
Matt Dowle

5
Chúng ta có thể có được một phiên bản cập nhật của điểm chuẩn này không, khá rõ ràng rằng băng ghế này thực sự là một trường hợp cạnh và hiện tại nó đã được sửa. Cho rằng tất cả các điểm chuẩn tôi đã thấy cho thấy data.table nhanh hơn tôi muốn xem số hợp nhất là gì?
statquant

3
@statquant Tôi không chạy điểm chuẩn ban đầu, nhưng tôi thực sự thích thấy Wes cập nhật điểm chuẩn.
Zach

Câu trả lời:


120

Có vẻ như Wes có thể đã phát hiện ra một vấn đề đã biết data.tablekhi số lượng chuỗi ( cấp ) duy nhất lớn: 10.000.

Rprof()tiết lộ hầu hết thời gian trong cuộc gọi sortedmatch(levels(i[[lc]]), levels(x[[rc]])? Đây không thực sự là sự tham gia của chính nó (thuật toán), mà là một bước sơ bộ.

Những nỗ lực gần đây đã đi vào việc cho phép các cột ký tự trong các khóa, điều này sẽ giải quyết vấn đề đó bằng cách tích hợp chặt chẽ hơn với bảng băm chuỗi toàn cầu của riêng R. Một số kết quả điểm chuẩn đã được báo cáo bởi test.data.table()nhưng mã đó chưa được nối để thay thế các mức thành mức phù hợp.

Là gấu trúc hợp nhất nhanh hơn so data.tablevới các cột số nguyên thông thường? Đó phải là một cách để cô lập chính thuật toán và các vấn đề về yếu tố.

Ngoài ra, data.tablechuỗi thời gian hợp nhất trong tâm trí. Hai khía cạnh đó: i) các khóa được sắp xếp theo nhiều cột như (id, datetime) ii) tham gia nhanh chóng ( roll=TRUE) hay còn gọi là quan sát cuối cùng được chuyển tiếp.

Tôi sẽ cần một chút thời gian để xác nhận vì đây là lần đầu tiên tôi thấy so sánh data.tablenhư được trình bày.


CẬP NHẬT từ data.table v1.8.0 phát hành tháng 7 năm 2012

  • Hàm bên trong sortmatch () đã bị xóa và được thay thế bằng chmatch () khi khớp cấp i với cấp x cho các cột thuộc loại 'hệ số'. Bước sơ bộ này đã gây ra sự chậm lại đáng kể (đã biết) khi số cấp của một cột yếu tố lớn (ví dụ> 10.000). Làm trầm trọng hơn trong các thử nghiệm tham gia bốn cột như vậy, như thể hiện bởi Wes McKinney (tác giả của gói Pandas Python). Ví dụ, khớp với 1 triệu chuỗi trong đó 600.000 là duy nhất giảm từ 16 xuống còn 0,5 giây.

cũng trong bản phát hành đó là:

  • các cột ký tự hiện được phép trong các khóa và được ưu tiên cho hệ số. data.table () và setkey () không còn ép buộc ký tự thành yếu tố. Các yếu tố vẫn được hỗ trợ. Triển khai FR # 1493, FR # 1224 và (một phần) FR # 951.

  • Các hàm mới chmatch () và% chin%, các phiên bản khớp () và% in% nhanh hơn cho các vectơ ký tự. Bộ đệm chuỗi nội bộ của R được sử dụng (không có bảng băm nào được tạo). Chúng nhanh hơn khoảng 4 lần so với match () trong ví dụ trong? Chmatch.

Kể từ tháng 9 năm 2013 data.table là v1.8.10 trên CRAN và chúng tôi đang làm việc trên v1.9.0. TIN TỨC được cập nhật trực tiếp.


Nhưng như tôi đã viết ban đầu, ở trên:

data.tablechuỗi thời gian hợp nhất trong tâm trí. Hai khía cạnh đó: i) các khóa được sắp xếp theo nhiều cột như (id, datetime) ii) tham gia nhanh chóng ( roll=TRUE) hay còn gọi là quan sát cuối cùng được chuyển tiếp.

Vì vậy, Pandas Equi tham gia của hai cột ký tự có thể vẫn nhanh hơn data.table. Vì có vẻ như nó băm hai cột kết hợp. data.table không băm khóa vì nó đã được sắp xếp theo thứ tự tham gia. "Khóa" trong data.table theo nghĩa đen chỉ là thứ tự sắp xếp (tương tự như một chỉ mục được nhóm trong SQL; nghĩa là cách dữ liệu được sắp xếp trong RAM). Trên danh sách là để thêm các khóa phụ, ví dụ.

Tóm lại, sự khác biệt về tốc độ rõ ràng được làm nổi bật bằng thử nghiệm hai cột đặc biệt này với hơn 10.000 chuỗi duy nhất không nên tệ như bây giờ, vì sự cố đã biết đã được khắc phục.


6
Nếu bạn cung cấp một trường hợp thử nghiệm cho một tập hợp dữ liệu thực tế, lớn, tôi sẽ vui lòng chạy các điểm chuẩn. Bạn cũng được chào đón nhiều hơn. Tôi thực sự chưa tối ưu hóa mã cho trường hợp khóa số nguyên (đặt mã đó vào danh sách việc cần làm của tôi!), Nhưng bạn có thể mong đợi hiệu suất tốt hơn đáng kể so với trường hợp chuỗi được đưa ra trong nghiên cứu bảng băm trong bản trình bày được liên kết.
Wes McKinney

22
Tôi không sử dụng một trong hai thư viện này nhưng rất vui khi thấy phản hồi mang tính xây dựng từ phía R trong hình dạng của Matthew Dowle.
SlowLearner

3
Đây là một số kết quả Rprof pastie.org/3258362 . Có vẻ như 20-40% thời gian được dành cho sortmatch tùy thuộc vào loại tham gia. Sẽ phải xem xét các cột số nguyên vào một lần khác-- Tôi đã tạo ra một vấn đề GitHub của gấu trúc để nhắc nhở tôi tối ưu hóa trường hợp đó ( github.com/wesm/pandas/issues/682 )
Wes McKinney

14
@AndyHayden Cải tiến đã được thực hiện một thời gian trước đây. Tôi sẽ chỉnh sửa trong các mục TIN TỨC. Wes chọn trong một bài kiểm tra cụ thể (Equi nối hai cột ký tự) chơi với vấn đề đã biết. Nếu anh ấy chọn các cột số nguyên thì nó sẽ khác. Và nếu anh ấy cho tôi ngẩng cao đầu trước khi trình bày điểm chuẩn tại hội nghị thì tôi có thể nói với anh ấy nhiều hơn về vấn đề đã biết.
Matt Dowle

191

Lý do gấu trúc nhanh hơn là vì tôi đã đưa ra một thuật toán tốt hơn, được triển khai rất cẩn thận bằng cách sử dụng bảng băm nhanh - klib và trong C / Cython để tránh trình thông dịch Python cho các phần không thể vector hóa. Thuật toán được mô tả chi tiết trong bài trình bày của tôi: Một cái nhìn bên trong thiết kế và phát triển gấu trúc .

Việc so sánh data.tablethực sự hơi thú vị bởi vì toàn bộ điểm của R data.tablelà nó chứa các chỉ mục được tính toán trước cho các cột khác nhau để tăng tốc các hoạt động như lựa chọn và hợp nhất dữ liệu. Trong trường hợp này (Data tham gia) DataFrame của gấu trúc không chứa thông tin được tính toán trước đang được sử dụng để hợp nhất, do đó, có thể nói đó là hợp nhất "lạnh". Nếu tôi đã lưu trữ các phiên bản được nhân tố của các phím tham gia, thì phép nối sẽ nhanh hơn đáng kể - vì hệ số hóa là nút cổ chai lớn nhất cho thuật toán này.

Tôi cũng nên nói thêm rằng thiết kế bên trong của DataFrame của gấu trúc có thể dễ sử dụng hơn các loại hoạt động này so với data.frame của R (chỉ là một danh sách các mảng bên trong).


76
Tất nhiên, bây giờ bạn đã tìm ra tất cả bằng python, thật dễ dàng để dịch sang R;)
hadley

37
Nhưng tại sao bất cứ ai cũng muốn? :)
ely

9
Umm ... có lẽ bởi vì họ muốn các hoạt động dữ liệu nhanh hơn trong R? Chỉ cần đoán :))
lebatsnok

28
Xin chào Wes-- có vẻ như kết quả của bạn data.tablelà do lỗi chính đã được sửa. Bất kỳ cơ hội nào bạn có thể chạy lại điểm chuẩn của mình và viết một bài đăng blog cập nhật?
Zach

6
Zach đảm bảo bạn kiểm tra điều này: github.com/Rdatitable/data.table/wiki/Benchmark-:-Grouping
Merik

37

Chủ đề này đã được hai năm nhưng dường như là nơi có thể để mọi người hạ cánh khi họ tìm kiếm sự so sánh giữa Pandas và data.table

Vì cả hai đã phát triển theo thời gian, tôi muốn đăng một so sánh tương đối mới hơn (từ 2014) tại đây cho những người dùng quan tâm: https://github.com/Rdatitable/data.table/wiki/Benchmark-:-Grouping

Sẽ rất thú vị nếu biết Wes và / hoặc Matt (người, nhân tiện, là người tạo ra Pandas và data.table tương ứng và có cả hai nhận xét ở trên) có bất kỳ tin tức nào để thêm vào đây không.

- CẬP NHẬT -

Một bình luận được đăng dưới đây bởi jangorecki có chứa một liên kết mà tôi nghĩ là rất hữu ích: https://github.com/szilard/benchm-database

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

Biểu đồ này mô tả thời gian tổng hợp trung bình và tham gia các hoạt động cho các công nghệ khác nhau ( thấp hơn = nhanh hơn ; so sánh được cập nhật lần cuối vào tháng 9 năm 2016). Nó thực sự mang tính giáo dục đối với tôi.

Quay trở lại câu hỏi R DT keyR DTtham khảo các hương vị được khóa / không bị khóa của dữ liệu của R.table và tình cờ sẽ nhanh hơn trong tiêu chuẩn này so với Pandas của Python ( Py pandas).


1
Tôi vừa đăng bài này! Cảm ơn đã thêm.
Zach

7
@Zach thấy điều này: github.com/szilard/benchm-database và điều đó cũng tốt: loadeck.com/szilard/ Kẻ
jangorecki

1
@ Zach bốn năm sau, kết quả điểm chuẩn mới cuối cùng đã xuất hiện, xem câu trả lời của tôi dưới đây.
jangorecki

7

Có những câu trả lời tuyệt vời, đáng chú ý được thực hiện bởi các tác giả của cả hai công cụ mà câu hỏi hỏi về. Câu trả lời của Matt giải thích trường hợp được báo cáo trong câu hỏi, rằng đó là do lỗi và không phải là thuật toán hợp nhất. Lỗi đã được sửa vào ngày hôm sau, hơn 7 năm trước.

Trong câu trả lời của tôi, tôi sẽ cung cấp một số thời gian cập nhật của hoạt động hợp nhất cho data.table và gấu trúc. Lưu ý rằng không bao gồm plyr và cơ sở R hợp nhất.

Thời gian tôi đang trình bày đến từ dự án chuẩn db , một điểm chuẩn có thể lặp lại chạy liên tục. Nó nâng cấp các công cụ lên các phiên bản gần đây và chạy lại các kịch bản chuẩn. Nó chạy nhiều giải pháp phần mềm khác. Nếu bạn quan tâm đến Spark, Dask và một vài người khác hãy chắc chắn kiểm tra liên kết.


Đến bây giờ ... (vẫn sẽ được triển khai: thêm một kích thước dữ liệu và 5 câu hỏi nữa)

Chúng tôi kiểm tra 2 kích thước dữ liệu khác nhau của bảng LHS.
Đối với mỗi kích thước dữ liệu đó, chúng tôi chạy 5 câu hỏi hợp nhất khác nhau.

q1: LHS bên tham gia RHS- nhỏ trên nguyên
q2: LHS bên tham gia RHS-vừa về nguyên
q3: LHS ngoài tham gia RHS-vừa về nguyên
q4: LHS bên tham gia RHS-trung vào yếu tố (phân loại)
q5: LHS bên tham gia RHS- lớn về số nguyên

Bảng RHS có 3 kích cỡ khác nhau

  • dịch nhỏ theo kích thước của LHS / 1e6
  • phương tiện chuyển thành kích thước của LHS / 1e3
  • lớn dịch theo kích thước của LHS

Trong tất cả các trường hợp, có khoảng 90% các hàng khớp giữa LHS và RHS và không có bản sao nào trong cột tham gia RHS (không có sản phẩm cartesian).


Tính đến thời điểm hiện tại (chạy vào ngày 2 tháng 11 năm 2019)

pandas 0.25.3 được phát hành vào ngày 1 tháng 11 năm 2019
data.table 0.12.7 (92abb70) được phát hành vào ngày 2 tháng 11 năm 2019

Thời gian dưới đây tính bằng giây, cho hai kích thước dữ liệu khác nhau của LHS. Cột pd2dtđược thêm tỷ lệ lưu trữ trường về số lần gấu trúc chậm hơn data.table.

  • Dữ liệu LHS 0,5 GB
+-----------+--------------+----------+--------+
| 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 |
+-----------+--------------+----------+--------+
  • Dữ liệu LHS 5 GB
+-----------+--------------+----------+--------+
| 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 |
+-----------+--------------+----------+--------+

Cảm ơn bạn đã cập nhật từ tương lai! Bạn có thể thêm một cột cho việc thực hiện R vs python của data.table không?
Zach

1
Tôi nghĩ thật tốt khi chỉ cần truy cập trang web và kiểm tra nó, ngay cả khi xem R dt vs gấu trúc. Và pyDT không phải là một phần của câu hỏi ban đầu thực sự.
jangorecki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.