পান্ডাগুলি কেন পাইথনগুলিতে ডেথারের তুলনায় দ্রুত দ্রবীভূত হয়েছিল?


160

আমি সম্প্রতি পাইথনের জন্য পান্ডাস লাইব্রেরি জুড়ে এসেছি , যা এই মানদণ্ড অনুসারে মেমরির একীকরণগুলিতে খুব দ্রুত সম্পাদন করে। এটি আর-এর ডেটা টেবিল প্যাকেজের চেয়ে আরও দ্রুত (বিশ্লেষণের জন্য আমার পছন্দের ভাষা)।

এর pandasচেয়ে এত দ্রুত কেন data.table? অজগরটির উপর আরথের সহজাত গতির সুবিধার কারণে এটি রয়েছে, বা এমন কোনও ট্রেডঅফ আছে যা সম্পর্কে আমি অবগত নই? সেখানে ভেতরের এবং বাইরের যোগ দিল সম্পাদন করার জন্য একটা উপায় আছে কি data.tableঅবলম্বন না merge(X, Y, all=FALSE)এবং merge(X, Y, all=TRUE)?

তুলনা

এখানে আর কোড এবং পাইথন কোড বেঞ্চমার্ক বিভিন্ন প্যাকেজ ব্যবহার করা হয়।


10
@ জোশুয়া অলিরিচ: আইআইআরসি data.tableকেবলমাত্র উত্তরাধিকার সূত্রে প্রাপ্ত data.frame, তবে এটি হুডের নীচে সি-কোডের উপর নির্ভর করে।
ডিগএমএল সমস্ত

4
@ জোশুয়া আপনি "ডেটা.ফ্রেমগুলি সিতে চালিত করলেও ধীর" বলে আপনার কী বোঝায়? এটি কি অন্য কিছু সম্পর্কিত? আর ধীর?
ম্যাট ডাওল

12
@ জোশুয়াউলিরিচ আমি কেবল লক্ষ্য করেছি যে এই মন্তব্যের পথটি কখনই বিছানায় পড়ে ছিল না। সুতরাং এটি পরিষ্কার করতে: এই আলোচনার পরপরই set()যুক্ত করা হয়েছিল data.table। খুব অনুরূপ :=তবে [.data.tableলুপ করা যখন এর ছোট ওভারহেড এড়ানো এবং ফলস্বরূপ দ্রুত হিসাবে এটি matrix। অতএব, data.frame পারবেন না শুধু ম্যাট্রিক্স যত দ্রুত কাজে ব্যবহৃত হতে পারে। বেঞ্চমার্ক এখানে
ম্যাট ডাওল

5
আমরা কি এই বেঞ্চমার্কের একটি আপডেট সংস্করণ পেতে পারি, এটি স্পষ্টভাবে স্পষ্ট যে এই বেঞ্চটি আসলে একটি প্রান্তের কেস ছিল এবং এটি এখনই স্থির হয়ে গেছে। প্রদত্ত যে সমস্ত মানদণ্ডগুলি আমি দেখেছি সেগুলি দেখায় যে ডেটা.ট্যাবলটি দ্রুত আমি কী একত্রীকরণ নম্বরটি দেখতে চাই?
স্ট্যাটিক্যান্ট

3
@ তবুও আমি আসল বেঞ্চমার্কটি চালাইনি, তবে ওয়েস বেঞ্চমার্কটি আপডেট করতে দেখতে সত্যিই আমি পছন্দ করব।
Zach

উত্তর:


120

দেখে মনে হচ্ছে ওয়েস একটি data.tableঅনন্য স্ট্রিং ( স্তর ) সংখ্যাটি বড় হলে 10,000 এটি একটি পরিচিত সমস্যা আবিষ্কার করেছে ।

না Rprof()সময় কলে অতিবাহিত অধিকাংশ প্রকাশ sortedmatch(levels(i[[lc]]), levels(x[[rc]])? এটি সত্যিই নিজে যোগদান (অ্যালগরিদম) নয়, তবে প্রাথমিক পদক্ষেপ।

সাম্প্রতিক প্রচেষ্টাগুলি কীগুলিতে অক্ষর কলামগুলিকে মঞ্জুরি দেওয়ার ক্ষেত্রে চলেছে, যা আর এর নিজস্ব বৈশ্বিক স্ট্রিং হ্যাশ টেবিলের সাথে আরও ঘনিষ্ঠভাবে সংহত করে সেই সমস্যাটি সমাধান করা উচিত। কিছু বেঞ্চমার্ক ফলাফল ইতিমধ্যে দ্বারা প্রতিবেদন করা হয়েছে test.data.table()তবে সেই কোডটি স্তরের সাথে মিলের স্তরগুলিকে প্রতিস্থাপন করতে এখনও কোডটি আপ করা হয়নি।

পাণ্ডাসগুলি কি data.tableনিয়মিত পূর্ণসংখ্যা কলামগুলির চেয়ে দ্রুত একত্রিত হয় ? এটি অ্যালগরিদম নিজেই বনাম ফ্যাক্টর সমস্যাগুলি পৃথক করার একটি উপায় হওয়া উচিত।

এছাড়াও, data.tableহয়েছে সময় সিরিজ একত্রীকরণ মনে। এর দুটি দিক: i) একাধিক কলাম নির্দেশিত কী যেমন (আইডি, ডেটটাইম) ii) দ্রুত প্রচলিত যোগদান ( roll=TRUE) ওরফে শেষ পর্যবেক্ষণটি এগিয়ে নিয়ে যাওয়া হয়েছে।

data.tableউপস্থাপনের তুলনায় এটিই আমি প্রথম দেখেছি বলে নিশ্চিত হওয়ার জন্য আমার কিছুটা সময় প্রয়োজন ।


জুলাই ২০১২ এ প্রকাশিত ডেটা.ট্যাবিল v1.8.0 থেকে আপডেট

  • টাইপ 'ফ্যাক্টর' এর কলামগুলির সাথে আই লেভেলের সাথে x স্তরের সাথে মেলে যখন অভ্যন্তরীণ ফাংশন सॉোর্টমেচ () মুছে ফেলা হয় এবং chmatch () এর সাথে প্রতিস্থাপন করা হয়। এই প্রাথমিক পদক্ষেপটি যখন একটি ফ্যাক্টর কলামের স্তরের সংখ্যা বড় ছিল (উদাঃ> 10,000) তখন একটি (জ্ঞাত) তাৎপর্যহীন মন্দার কারণ ছিল। ওয়েস ম্যাককেনি (পাইথন প্যাকেজ প্যান্ডাসের লেখক) দ্বারা প্রদর্শিত যেমন এই জাতীয় চারটি কলামে যোগদানের পরীক্ষায় বাড়ে। মিলিয়ন স্ট্রিংগুলির মধ্যে মিল রয়েছে যার মধ্যে ,000০০,০০০ অনন্য, উদাহরণস্বরূপ, এখন ১s এর দশক থেকে ০.০ সেটে নামিয়ে আনা হয়েছে।

যে মুক্তি ছিল:

  • অক্ষর কলামগুলি এখন কীগুলিতে অনুমোদিত এবং ফ্যাক্টরটি পছন্দ করা হয়। ডেটা.টিটেবল () এবং সেটকি () আর অক্ষরকে ফ্যাক্টারে জোর করে না। উপাদানগুলি এখনও সমর্থিত। FR # 1493, FR # 1224 এবং (আংশিকভাবে) এফআর # 951 কার্যকর করে lements

  • নতুন ফাংশন chmatch () এবং% chin%, ম্যাচের দ্রুত সংস্করণ () এবং% তে অক্ষর ভেক্টরগুলির জন্য। আর এর অভ্যন্তরীণ স্ট্রিং ক্যাশে ব্যবহার করা হয়েছে (কোনও হ্যাশ টেবিল তৈরি করা হয়নি)। তারা? চিমেচ উদাহরণে ম্যাচের তুলনায় প্রায় 4 গুণ বেশি দ্রুত।

২০১৩ সালের সেপ্টেম্বর পর্যন্ত তথ্য.ট্যাবিল CRAN এ v1.8.10 এবং আমরা v1.9.0 এ কাজ করছি। নিউজ লাইভ আপডেট করা হয়।


তবে আমি যেমনটি লিখেছি মূলত:

data.tableহয়েছে সময় সিরিজ একত্রীকরণ মনে। এর দুটি দিক: i) একাধিক কলাম নির্দেশিত কী যেমন (আইডি, ডেটটাইম) ii) দ্রুত প্রচলিত যোগদান ( roll=TRUE) ওরফে শেষ পর্যবেক্ষণটি এগিয়ে নিয়ে যাওয়া হয়েছে।

সুতরাং দুটি চরিত্রের কলামের পান্ডাস ইকুয় যোগ সম্ভবত ডেটা টেবিলের চেয়ে এখনও দ্রুত। যেহেতু মনে হচ্ছে এটি সংযুক্ত দুটি কলাম হ্যাশ করছে। ডেটা টেবিলটি কীটি হ্যাশ করে না কারণ এটি বিরাজমান অর্ডারটিকে মনে রেখে যায়। ডেটা.ট্যাবেলে একটি "কী" আক্ষরিক অর্থেই সাজান অর্ডার (এসকিউএল এর ক্লাস্টারড ইনডেক্সের অনুরূপ; যেমন, র‌্যামে ডেটা অর্ডার করা হয়)। তালিকায় উদাহরণস্বরূপ মাধ্যমিক কী যুক্ত করা হবে।

সংক্ষেপে, 10,000 টিরও বেশি অনন্য স্ট্রিং সহ এই দুটি দ্বি-চরিত্রের-কলাম পরীক্ষার মাধ্যমে স্পষ্ট করে দেওয়া স্পষ্ট গতির পার্থক্যটি এখনকার হিসাবে খারাপ হওয়া উচিত নয়, যেহেতু জানা সমস্যাটি স্থির হয়েছে।


6
যদি আপনি যুক্তিসঙ্গতভাবে বৃহত, বাস্তববাদী ডেটা সেটের জন্য কোনও পরীক্ষার কেস সরবরাহ করেন তবে আমি বেঞ্চমার্কগুলি চালাতে পেরে খুশি হব। আপনি স্বাগত চেয়েও বেশি। আমি আসলে এখনও পূর্ণসংখ্যার কী মামলায় যোগ দেওয়ার কোডটি অপ্টিমাইজ করতে পারি নি (এটি আমার টোডো তালিকায় রাখুন!) তবে আপনি লিঙ্কযুক্ত উপস্থাপনায় হ্যাশ টেবিল স্টাডি দিয়ে স্ট্রিং কেসের চেয়ে উল্লেখযোগ্যভাবে আরও ভাল পারফরম্যান্স আশা করতে পারেন।
ওয়েস ম্যাককিনে 25'12

22
আমি এই লাইব্রেরিগুলির কোনওটিই ব্যবহার করি না তবে ম্যাথিউ ডাউলের ​​আকারে আর দিক থেকে গঠনমূলক প্রতিক্রিয়া দেখে খুশি হয়েছি।
স্লোলিয়ারার

3
এখানে কিছু আরআরফফ ফলাফল pastie.org/3258362 । দেখে মনে হচ্ছে 20-40% সময় যোগের ধরণের উপর নির্ভর করে সাজানো মেশিনে ব্যয় করেছে। আর একবার পূর্ণসংখ্যার কলামগুলিতে সন্ধান করতে হবে - সেই কেসটি অপ্টিমাইজ করতে আমাকে স্মরণ করিয়ে দেওয়ার জন্য আমি একটি পান্ডাস গিটহাব ইস্যু তৈরি করেছি ( github.com/wesm/pandas/issues/682 )
ওয়েস

14
অ্যান্ডি হেডেন উন্নতি কিছু সময় আগে করা হয়েছিল। আমি নিউজ আইটেমগুলিতে সম্পাদনা করব। ওয়েস একটি নির্দিষ্ট পরীক্ষা (সমান দুটি চরিত্রের কলামে যোগদান) বাছাই করে যা সেই সমস্যাটি খেলেছিল। তিনি যদি পূর্ণসংখ্যা কলামগুলি বেছে নিয়েছিলেন তবে এটি অন্যরকম হত। এবং যদি তিনি সম্মেলনে মানদণ্ড উপস্থাপনের আগে আমাকে মাথা তুলে দিতেন তবে আমি তাকে জানা সমস্যাটি সম্পর্কে আরও বলতে পারতাম।
ম্যাট ডাউলে

191

কারণ পান্ডাস দ্রুততর কারণ আমার আরও ভালো অ্যালগরিদম, যা খুব সাবধানে বাস্তবায়িত হয় ব্যবহার নিয়ে এসেছেন ফাস্ট হ্যাশ টেবিল বাস্তবায়ন - klib এবং C / এ Cython অ vectorizable অংশের জন্য ওভারহেড পাইথন ইন্টারপ্রেটার এড়ানো। অ্যালগরিদমটি আমার উপস্থাপনায় কিছু বিশদে বর্ণনা করা হয়েছে: পান্ডাস ডিজাইন এবং বিকাশের ভিতরে একটি চেহারা

এর সাথে তুলনাটি data.tableআসলে কিছুটা আকর্ষণীয় কারণ আর এর পুরো পয়েন্টটি data.tableহ'ল এতে ডেটা নির্বাচন এবং মার্জগুলির মতো ক্রিয়াকলাপকে ত্বরান্বিত করার জন্য বিভিন্ন কলামের জন্য প্রাক-গণিত সূচী রয়েছে । এক্ষেত্রে (ডাটাবেস যোগ দেয়) প্যান্ডাসের ডেটাফ্রেমে কোনও প্রাক-গণিত তথ্য নেই যা মার্জ করার জন্য ব্যবহৃত হচ্ছে, সুতরাং এটি "শীতল" সংযুক্তির কথা বলতে। আমি যদি জয়েন কীগুলির ফ্যাক্টরাইজড সংস্করণগুলি সংরক্ষণ করে রাখতাম তবে যোগদানটি উল্লেখযোগ্যভাবে দ্রুততর হবে - কারণ এই অ্যালগরিদমের সবচেয়ে বড় বাধা হ'ল ফ্যাক্টরিজিং।

আমার আরও যোগ করা উচিত যে প্যানডাসের ডেটাফ্রেমের অভ্যন্তরীণ নকশা আর এর ডেটা.ফ্রেম (যা অভ্যন্তরীণভাবে অ্যারেগুলির একটি তালিকা মাত্র) এর চেয়ে এই ধরণের অপারেশনগুলিতে অনেক বেশি সাবলীল।


76
অবশ্যই, এখন আপনি অজগরটিতে এটি সন্ধান করেছেন, আরে অনুবাদ করা সহজ হওয়া উচিত;)
হ্যাডলি

37
তবে কেউ কেন কখনও চাইবে? :)
ely

9
উম্ম ... সম্ভবত তারা আর-তে আরও দ্রুত ডেটা অপারেশন করতে চান? কেবল অনুমান করা :))
লেবটসনোক

28
হাই ওয়েজ - দেখে মনে হচ্ছে আপনার ফলাফলগুলি data.tableপ্রাথমিকভাবে কোনও বাগ দ্বারা চালিত হয়েছিল যা ঠিক করা হয়েছে। আপনার বেঞ্চমার্কটি আবার চালাতে এবং একটি আপডেট ব্লগ পোস্ট লিখতে পারে এমন কোনও সুযোগ?
জাচ

6
জ্যাচ নিশ্চিত করুন যে আপনি এটি পরীক্ষা করে দেখেছেন
মেরিক

37

এই বিষয়টি দুই বছরের পুরনো তবে তারা পান্ডার এবং ডেটা.table এর তুলনা অনুসন্ধান করার সময় লোকেরা অবতরণের সম্ভাব্য জায়গার মতো বলে মনে হচ্ছে।

যেহেতু এই দু'টিই সময়ের সাথে সাথে বিকশিত হয়েছে, আগ্রহী ব্যবহারকারীদের জন্য আমি এখানে তুলনামূলকভাবে নতুন তুলনা (২০১৪ থেকে) পোস্ট করতে চাই: https://github.com/Rdatatable/data.table/wiki/Benchmark-:- গোষ্ঠী

ওয়েস এবং / অথবা ম্যাট (যারা, প্যান্ডাস এবং ডেটা নির্মাতা এবং যথাক্রমে ডেটা টেবিলের স্রষ্টা এবং উপরে উভয় মন্তব্য করেছেন) এখানেও এখানে যুক্ত করার জন্য কোনও সংবাদ আছে কিনা তা জানতে আগ্রহী হবে।

-- হালনাগাদ --

জাঙ্গোরেকি নীচে পোস্ট করা একটি মন্তব্যে এমন একটি লিঙ্ক রয়েছে যা আমি মনে করি এটি খুব দরকারী: https://github.com/szilard/benchm- ডেটাবেস

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

এই গ্রাফটি বিভিন্ন প্রযুক্তির একীকরণের গড় সময়গুলিকে চিত্রিত করে এবং অপারেশনগুলিতে যোগদান করে ( নিম্ন = দ্রুত ; তুলনা শেষ সেপ্টেম্বর 2016 এ আপডেট হয়েছে)। এটা আমার জন্য সত্যিই শিক্ষামূলক ছিল।

প্রশ্নটির দিকে ফিরে যান R DT keyএবং R DTআর এর ডেটা-র কীড / অপ্রচলিত স্বাদগুলি দেখুন able টেবিল এবং পাইথনের পান্ডাস ( Py pandas) এর চেয়ে এই মানদণ্ডে আরও দ্রুত হতে হবে ।


1
আমি এই পোস্ট শুধু ছিল! যোগ করার জন্য ধন্যবাদ.
Zach

7
@Zach এই দেখুন: github.com/szilard/benchm-databases এবং যে খুব সুন্দর হল: speakerdeck.com/szilard/...
jangorecki

1
@ জ্যাচ চার বছর পরে নতুন বেঞ্চমার্ক ফলাফল অবশেষে প্রকাশিত হয়েছে, নীচে আমার উত্তর দেখুন।
জঙ্গোরেকি

7

দুর্দান্ত উত্তর রয়েছে, উল্লেখযোগ্যভাবে উভয় সরঞ্জামের লেখক যা প্রশ্ন জিজ্ঞাসা করে। ম্যাট এর উত্তর প্রশ্নে উল্লিখিত কেসটি ব্যাখ্যা করে যে এটি কোনও বাগের কারণে হয়েছিল, মার্জ অ্যালগরিদম নয়। বাগটি পরের দিন ঠিক হয়ে গিয়েছিল, 7 বছর আগেও ইতিমধ্যে।

আমার উত্তরে আমি ডেটা টেবিল এবং পান্ডার জন্য একত্রীকরণের অপার টু ডেট সময় সরবরাহ করব। নোট করুন যে প্লায়ার এবং বেস আর মার্জ অন্তর্ভুক্ত করা হয় না।

আমি যে সময়গুলি উপস্থাপন করছি সেগুলি ডিবি-বেঞ্চমার্ক প্রকল্প থেকে আসছে , এটি একটি নিয়মিত চালিত প্রজননযোগ্য বেঞ্চমার্ক। এটি সাম্প্রতিক সংস্করণগুলিতে সরঞ্জামগুলি আপগ্রেড করে এবং পুনরায় রান করে বেঞ্চমার্ক স্ক্রিপ্টগুলি। এটি অন্যান্য অনেকগুলি সফ্টওয়্যার সমাধান চালায়। আপনি যদি স্পার্কে আগ্রহী হন তবে ডাস্ক এবং আরও কয়েক জন লিঙ্কটি পরীক্ষা করে দেখতে নিশ্চিত হন।


এখন পর্যন্ত ... (এখনও প্রয়োগ করা হবে: আরও একটি ডেটার আকার এবং আরও 5 টি প্রশ্ন)

আমরা 2 টি পৃথক ডেটা মাপের এলএইচএস টেবিলের পরীক্ষা করি।
এই প্রতিটি ডাটা আকারের জন্য আমরা 5 টি আলাদা মার্জ প্রশ্ন চালাই run

Q1: LHS ভেতরের RHS- যোগদানের ছোট পূর্ণসংখ্যা উপর
Q2: ভেতরের যোগদানের RHS-মাঝারি পূর্ণসংখ্যা উপর LHS
LHS: Q3 বাইরের যোগদানের RHS-মাঝারি পূর্ণসংখ্যা উপর
Q4: LHS ভেতরের যোগদানের RHS-মাধ্যমের উপর ফ্যাক্টর (শ্রেণীগত)
Q5: ভেতরের LHS যোগদানের RHS- পূর্ণসংখ্যার উপর বড়

আরএইচএসের টেবিলটি 3 টি বিভিন্ন আকারের

  • ছোট LHS / 1e6 আকারের অনুবাদ
  • মাঝারি LHS / 1e3 আকারের অনুবাদ
  • LHS আকারে বড় অনুবাদ করে

সমস্ত ক্ষেত্রে এলএইচএস এবং আরএইচএসের মধ্যে প্রায় 90% সারি সারি সারি রয়েছে এবং আরএইচএসে যোগদানকারী কলামে কোনও নকল নেই (কার্টেসিয়ান পণ্য নেই)।


এখন পর্যন্ত (2 নভেম্বর 2019 এ চালানো)

পান্ডাস 0.25.3 1 নভেম্বর 2019
প্রকাশিত তথ্য। টেবিল 0.12.7 (92abb70) 2 নভেম্বর 2019 এ প্রকাশিত

এলএইচএসের দুটি পৃথক ডেটা মাপের জন্য, নীচে সময়গুলি সেকেন্ডে থাকে। pd2dtডেটা.টিটেবলের চেয়ে কত গুণ পান্ডাস ধীর গতির কলামে ফিল্ড স্টোরিং অনুপাত যুক্ত করা হয়েছে।

  • 0.5 জিবি এলএইচএস ডেটা
+-----------+--------------+----------+--------+
| 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 |
+-----------+--------------+----------+--------+
  • 5 জিবি এলএইচএস ডেটা
+-----------+--------------+----------+--------+
| 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 |
+-----------+--------------+----------+--------+

ভবিষ্যত থেকে আপডেটের জন্য আপনাকে ধন্যবাদ! আপনি কি ডেটা.ট্যাবিলের আর বনাম অজগর বাস্তবায়নের জন্য একটি কলাম যুক্ত করতে পারেন?
জ্যাচ

1
আমি কেবল ওয়েবসাইটে গিয়ে এটি পরীক্ষা করা ভাল বলে মনে করি, এমনকি ডি ডি বনাম পান্ডাসের জন্যও। এবং পিডিডিটি আসলেই মূল প্রশ্নের অংশ ছিল না।
জঙ্গোরেকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.