ตอนนี้แพนด้าเร็วกว่า data.table หรือไม่


17

https://github.com/Rdatatable/data.table/wiki/Benchmarks-%3A-Grouping

มาตรฐานที่ data.table ยังไม่ได้รับการปรับปรุงตั้งแต่ปี 2014 ผมได้ยินมาว่าที่ใดที่หนึ่งคือตอนนี้เร็วกว่าPandas data.tableมันเป็นเรื่องจริงเหรอ? มีใครทำเปรียบเทียบบ้างไหม? ฉันไม่เคยใช้ Python มาก่อน แต่จะพิจารณาเปลี่ยนหากpandasสามารถเอาชนะได้data.tableหรือไม่


7
นั่นเป็นเหตุผลที่แย่มากที่จะเปลี่ยนมาใช้งูหลาม
Matthew Drury

2
@ MatthewDury อย่างไรเหรอ? ข้อมูลและการจัดการของมันคือ 80% ของงานของฉัน มีเพียง 20% เท่านั้นที่ปรับรุ่นและการนำเสนอให้เหมาะสม ทำไมฉันไม่ควรเลือกอันที่ให้ผลลัพธ์เร็วที่สุด?
xiaodai

2
python และ R เป็นภาษาที่สร้างขึ้นพร้อมกับระบบนิเวศและชุมชนขนาดใหญ่ เพื่อลดการเลือกห้องสมุดเดียวคือการบูชาต้นไม้ต้นเดียวในป่าอันกว้างใหญ่ ถึงกระนั้นประสิทธิภาพก็เป็นเพียงข้อกังวลอย่างหนึ่งของหลาย ๆ คนสำหรับห้องสมุดเดี่ยว (ความหมายของอินเทอร์เฟซที่แสดงออกได้อย่างไรมันเชื่อมต่อกับห้องสมุดอื่น ๆ ได้อย่างไร ฉันจะยืนยันว่าตัวเลือกนั้นเป็นขั้วคู่ที่ผิดพลาด ชุมชนทั้งสองแห่งมีจุดเน้นที่แตกต่างกันซึ่งให้ความสำคัญกับภาษาที่แตกต่างกัน
Matthew Drury

3
คุณมีป่าใหญ่ที่ดีสำหรับ 20% ของงานหรือไม่ ดังนั้นอย่าเลือกที่จะกระทบ 80% ของงานของคุณ? ไม่มีอะไรหยุดยั้งฉันจากการใช้หมีแพนด้าเพื่อเตรียมข้อมูลจากนั้นทำโมเดลใน R python หรือ Julia ฉันคิดว่าความคิดของฉันเป็นเสียง ถ้าหมีแพนด้าเร็วกว่าที่ฉันควรเลือกให้เป็นเครื่องมือหลักของฉัน
xiaodai

1
คุณอาจพบแพ็คเกจแบบreticulateใน R of interest / use นอกจากนี้ยังมีความพยายามมากขึ้นในการทำให้ R ทำงาน / เล่นกับฐานข้อมูล (ดูความพยายามเช่นdbplyr )
slackline

คำตอบ:


15

มีใครทำเปรียบเทียบบ้างไหม?

ใช่เกณฑ์มาตรฐานที่คุณเชื่อมโยงในคำถามของคุณได้รับการอัปเดตเมื่อเร็ว ๆ นี้สำหรับ data.table และ pandas รุ่นล่าสุด นอกจากนี้ยังมีการเพิ่มซอฟต์แวร์อื่น คุณสามารถค้นหาเกณฑ์มาตรฐานที่ปรับปรุงแล้วได้ที่https://h2oai.github.io/db-benchmark
แต่น่าเสียดายที่มันถูกกำหนดไว้ในเครื่องหน่วยความจำ 125GB (ไม่ใช่ 244GB เหมือนเดิม) ในฐานะที่เป็นผลให้แพนด้าและ dask ไม่สามารถที่จะพยายามgroupbyในข้อมูล 1e9 แถว (50GB csv) เพราะพวกเขาหมดหน่วยความจำเมื่ออ่านข้อมูล ดังนั้นสำหรับ pandas vs data.table คุณต้องดูข้อมูล 1e8 แถว (5GB)

ไม่ใช่แค่เชื่อมโยงเนื้อหาที่คุณต้องการฉันกำลังวางกำหนดเวลาล่าสุดสำหรับโซลูชันเหล่านั้น

โปรดทราบว่าการกำหนดเวลาเหล่านั้นล้าสมัยแล้ว
โปรดไปที่https://h2oai.github.io/db-benchmarkสำหรับการกำหนดเวลาที่อัปเดต

| in_rows|question              | data.table| pandas|
|-------:|:---------------------|----------:|------:|
|   1e+07|sum v1 by id1         |      0.140|  0.414|
|   1e+07|sum v1 by id1:id2     |      0.411|  1.171|
|   1e+07|sum v1 mean v3 by id3 |      0.574|  1.327|
|   1e+07|mean v1:v3 by id4     |      0.252|  0.189|
|   1e+07|sum v1:v3 by id6      |      0.595|  0.893|
|   1e+08|sum v1 by id1         |      1.551|  4.091|
|   1e+08|sum v1 by id1:id2     |      4.200| 11.557|
|   1e+08|sum v1 mean v3 by id3 |     10.634| 24.590|
|   1e+08|mean v1:v3 by id4     |      2.683|  2.133|
|   1e+08|sum v1:v3 by id6      |      6.963| 16.451|
|   1e+09|sum v1 by id1         |     15.063|     NA|
|   1e+09|sum v1 by id1:id2     |     44.240|     NA|
|   1e+09|sum v1 mean v3 by id3 |    157.430|     NA|
|   1e+09|mean v1:v3 by id4     |     26.855|     NA|
|   1e+09|sum v1:v3 by id6      |    120.376|     NA|

ใน 4 จาก 5 คำถาม data.table เร็วขึ้นและเราสามารถดูได้ดีกว่า
ทราบเพียงการกำหนดเวลานี้ ณ ขณะนี้ที่id1, id2และid3มีเขตข้อมูลตัวอักษร สิ่งเหล่านี้จะเปลี่ยนเป็น DONEอย่างเป็นทางการในไม่ช้า นอกจากนี้ยังมีปัจจัยอื่น ๆ ที่น่าจะส่งผลต่อการกำหนดเวลาเหล่านั้นในอนาคตอันใกล้ (เช่นการจัดกลุ่มใน DONE แบบขนาน ) นอกจากนี้เรายังจะเพิ่มมาตรฐานที่แยกต่างหากสำหรับข้อมูลที่มี NASและcardinalities ต่างๆ ทำ

งานอื่น ๆ ที่กำลังจะมาถึงโครงการการเปรียบเทียบนี้อย่างต่อเนื่องดังนั้นหากคุณมีความสนใจในjoin, sort, readและคนอื่น ๆ ให้แน่ใจว่าได้ตรวจสอบในภายหลัง
และแน่นอนว่าคุณยินดีที่จะให้ข้อเสนอแนะในโครงการซื้อคืน!


1
แล้ว JuliaDB ล่ะ?
skan

1
@skan คุณสามารถติดตามสถานะของสิ่งนั้นได้ในgithub.com/h2oai/db-benchmark/issues/63
jangorecki

1
คำตอบที่ดี - AFAICT ทดสอบมาตรฐานที่คุณเชื่อมโยงทั้งหมดทำงานบน VM เดียวกันหรือไม่ นั่นคือภายใต้เงื่อนไขเดียวกันแพนด้าและ dask ต้องการมากกว่า 128GB RAM สำหรับตาราง 50GB ในขณะที่คนอื่นสามารถทำได้ภายใต้ข้อ จำกัด นี้ ถ้าเป็นเช่นนั้นมันสะท้อนให้เห็นถึงประสบการณ์ของฉันกับการที่แพนด้าไม่มีประสิทธิภาพในการรับส่งข้อมูลปกติทุกวันบนโต๊ะขนาดปานกลาง (~ 10GB) และมันก็เป็นปัญหาที่ใหญ่กว่ามากในการใช้ความเร็วในการประมวลผล (ซึ่งมีความใกล้ชิดกันมากขึ้นและทำการค้าไปมาในกรณีใด ๆ ก็ตามขึ้นอยู่กับปริมาณงานที่เฉพาะเจาะจง)
jkf

@jkf ใช่แน่นอน เครื่องมีหน่วยความจำ 128 GB เนื่องจากเราวางแผนที่จะทดสอบการประมวลผล mem ในชุดข้อมูล 500 GB (10e9 แถว) ขณะนี้มีเพียง spark และ pydatatable เท่านั้นที่จะสนับสนุนสิ่งนั้นและอีกไม่นานที่จะเพิ่ม clickhouse
jangorecki

@angorecki นั่นเป็นมาตรฐานที่มีประโยชน์มาก ขอบคุณมากสำหรับความพยายาม ฉันสับสนเล็กน้อยเกี่ยวกับ dask ที่ไม่ได้ย่อยชุดข้อมูล 50GB Dask มีขนาดพาร์ติชันเป็นหนึ่งในพารามิเตอร์ (เช่นblocksizeในread_csv) คุณพยายามหลีกเลี่ยงการโทรcompute()และถ่ายโอนข้อมูลไปยังดิสก์เพื่อหลีกเลี่ยงการรวมตารางผลลัพธ์ทั้งหมดในหน่วยความจำหรือไม่?
Mischa Lisovyi

14

เพื่อนร่วมงานและฉันได้ทำการศึกษาเบื้องต้นเกี่ยวกับความแตกต่างของประสิทธิภาพระหว่างแพนด้าและดาต้าดาต้า คุณสามารถค้นหาการศึกษา (ซึ่งแบ่งออกเป็นสองส่วน) ในบล็อกของเรา(คุณสามารถหาส่วนที่สองได้ที่นี่ )

เราคิดว่ามีงานบางอย่างที่แพนด้ามีประสิทธิภาพเหนือกว่า data.table อย่างชัดเจน แต่ก็มีบางกรณีที่ data.table เร็วกว่ามาก คุณสามารถตรวจสอบด้วยตนเองและแจ้งให้เราทราบว่าคุณคิดอย่างไรกับผลลัพธ์

แก้ไข:
หากคุณไม่ต้องการอ่านบล็อกอย่างละเอียดนี่เป็นบทสรุปสั้น ๆ เกี่ยวกับการตั้งค่าและการค้นพบของเรา:

ติดตั้ง

เราเปรียบเทียบpandasและdata.tableชุดข้อมูลจำลองที่แตกต่างกัน 12 ชุดในการปฏิบัติการต่อไปนี้ (จนถึงตอนนี้) ซึ่งเราเรียกว่าสถานการณ์

  • การดึงข้อมูลด้วยการใช้งานที่คล้ายกัน
  • การกรองข้อมูลพร้อมการดำเนินการเลือกตามเงื่อนไข
  • การดำเนินการเรียงลำดับข้อมูล
  • การดำเนินการรวบรวมข้อมูล

การคำนวณดำเนินการบนเครื่องที่มี Intel i7 2.2GHz พร้อม 4 คอร์ทางกายภาพ, RAM 16GB และฮาร์ดไดรฟ์ SSD เวอร์ชันของซอฟต์แวร์คือ OS X 10.13.3, Python 3.6.4 และ R 3.4.2 ไลบรารี่แต่ละรุ่นที่ใช้คือ 0.22 สำหรับแพนด้าและ 1.10.4-3 สำหรับ data.table

ผลลัพธ์สรุป

  • data.tableดูเหมือนว่าจะเร็วขึ้นเมื่อเลือกคอลัมน์ ( pandasโดยเฉลี่ยใช้เวลามากกว่า 50%)
  • pandas เร็วกว่าในการกรองแถว (ประมาณ 50% โดยเฉลี่ย)
  • data.tableดูเหมือนจะเร็วกว่ามากในการเรียงลำดับ ( pandasบางครั้งช้ากว่า 100 เท่า)
  • การเพิ่มคอลัมน์ใหม่จะปรากฏขึ้นเร็วขึ้นด้วย pandas
  • ผลการรวมจะถูกผสมอย่างสมบูรณ์

โปรดทราบว่าฉันพยายามทำให้ผลลัพธ์ให้ง่ายที่สุดเท่าที่จะเป็นไปได้เพื่อไม่ให้คุณตาย สำหรับการมองเห็นที่สมบูรณ์มากขึ้นอ่านการศึกษา หากคุณไม่สามารถเข้าถึงหน้าเว็บของเราได้โปรดส่งข้อความถึงฉันและฉันจะส่งต่อเนื้อหาของเราให้กับคุณ คุณสามารถค้นหารหัสสำหรับการศึกษาที่สมบูรณ์แบบบนGitHub หากคุณมีความคิดวิธีปรับปรุงการศึกษาของเราโปรดส่งอีเมลถึงเรา คุณสามารถค้นหาผู้ติดต่อของเราได้ที่ GitHub


1
อย่างที่คุณอาจได้อ่านจากคำตอบของฉันฉันพูดไปแล้วว่าผลลัพธ์ต่าง ๆ โปรดอธิบายหากฉันจะเจาะจงมากขึ้นในคำตอบของฉันอาจอธิบายรายละเอียดเกี่ยวกับตัวเลข
Tobias Krabel

1
"การเข้าถึงไซต์นี้ของคุณถูก จำกัด " ฉันดูเหมือนจะไม่สามารถเข้าถึงเว็บไซต์บนโทรศัพท์ของฉันหรือบนคอมพิวเตอร์ที่ทำงานของฉัน
xiaodai

1
ฉันขอโทษที่อ่าน ฉันได้ตรวจสอบตัวเองในโทรศัพท์ของฉันและไม่มีปัญหา มีบางอย่างที่เกี่ยวข้องกับประเทศที่คุณพยายามเชื่อมต่อใช่ไหม
Tobias Krabel

1
"4 ฟิสิคัลคอร์" = 8 โลจิคัลคอร์ นอกจากนี้ยังช่วยบอกได้ว่า Intel i7 2.2GHz รุ่นใดที่เฉพาะเจาะจง (รุ่นใดรุ่นไหน? -HQ?) และขนาดแคชอะไร และสำหรับ SSD ความเร็วในการอ่านและเขียนคืออะไร?
smci

พวกเขาเปรียบเทียบกับ Julia dataframes และ JuliaDB อย่างไร
skan

3

Nope, อันที่จริงถ้าขนาดของชุดข้อมูลมีขนาดใหญ่มากจนแพนด้าล่มคุณจะติดอยู่กับ dask ซึ่งดูดและคุณไม่สามารถทำ groupby-sum ได้ง่ายๆ dplyr อาจจะไม่เร็ว แต่ก็ไม่เลอะ

ขณะนี้ฉันกำลังทำงานกับชุดข้อมูล 2G เล็กน้อยและprint(df.groupby(['INCLEVEL1'])["r"].sum())เกิดขัดข้องอย่างง่าย

ไม่พบข้อผิดพลาดนี้ด้วย dplyr

ดังนั้นถ้าหมีแพนด้าสามารถจัดการชุดข้อมูลฉันใช้หมีแพนด้าถ้าไม่ติดตารางข้อมูล R

และใช่คุณสามารถแปลง dask กลับไปเป็น dataframe ของ pandas ได้ง่าย ๆdf.compute() แต่ใช้เวลาค่อนข้างนานดังนั้นคุณอาจรอให้ pandas โหลดหรือ datatable อ่านอย่างอดทน


1
ไม่ทราบว่า Dask แย่มาก บางทีคุณต้องการลอง disk.frame ของ R? github.com/xiaodaigh/disk.frameฉันเป็นผู้แต่ง
xiaodai

1

ฉันรู้ว่านี่เป็นโพสต์ที่เก่ากว่า แต่คิดว่ามันอาจจะคุ้มค่าที่จะกล่าวถึง - การใช้ feather (ใน R และ Python) อนุญาตให้ใช้งานบน data เฟรม / data data และแชร์ผลลัพธ์เหล่านั้นผ่าน feather

ดูหน้า github ของขนนก


Segfaults สำหรับชุดข้อมูลขนาดกลางและขนาดใหญ่
jangorecki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.