আমি একই ধরণের কাজগুলি একক লাইনে একসাথে করে ফেলার অভ্যাসে আছি। উদাহরণস্বরূপ, যদি আমি ফিল্টার করতে প্রয়োজন a, bএবং cএকটি ডাটা টেবিলে, আমি তাদের একসঙ্গে এক রেখে দেব []ANDs না সঙ্গে। গতকাল, আমি লক্ষ্য করেছি যে আমার বিশেষ ক্ষেত্রে এটি পরিবর্তে অবিশ্বাস্যরূপে ধীর এবং পরীক্ষিত চেইন ফিল্টার ছিল। আমি নীচে একটি উদাহরণ অন্তর্ভুক্ত করেছি।
প্রথমত, আমি এলোমেলো সংখ্যা জেনারেটর বীজ করি, ডেটা.ট্যাবল লোড করি এবং একটি ডামি ডেটা সেট তৈরি করি।
# Set RNG seed
set.seed(-1)
# Load libraries
library(data.table)
# Create data table
dt <- data.table(a = sample(1:1000, 1e7, replace = TRUE),
b = sample(1:1000, 1e7, replace = TRUE),
c = sample(1:1000, 1e7, replace = TRUE),
d = runif(1e7))
এরপরে, আমি আমার পদ্ধতিগুলি সংজ্ঞায়িত করি। প্রথম পদ্ধতির চেইনগুলি একসাথে ফিল্টার করে। দ্বিতীয় অ্যান্ডস এক সাথে ফিল্টার করে।
# Chaining method
chain_filter <- function(){
dt[a %between% c(1, 10)
][b %between% c(100, 110)
][c %between% c(750, 760)]
}
# Anding method
and_filter <- function(){
dt[a %between% c(1, 10) & b %between% c(100, 110) & c %between% c(750, 760)]
}
এখানে, আমি পরীক্ষা করি তারা একই ফলাফল দেয়।
# Check both give same result
identical(chain_filter(), and_filter())
#> [1] TRUE
অবশেষে, আমি সেগুলি মানি।
# Benchmark
microbenchmark::microbenchmark(chain_filter(), and_filter())
#> Unit: milliseconds
#> expr min lq mean median uq max
#> chain_filter() 25.17734 31.24489 39.44092 37.53919 43.51588 78.12492
#> and_filter() 92.66411 112.06136 130.92834 127.64009 149.17320 206.61777
#> neval cld
#> 100 a
#> 100 b
2019-10-25 এ ডিপেক্স প্যাকেজ (v0.3.0) দ্বারা তৈরি করা হয়েছে
এই ক্ষেত্রে, চেইন রান সময় প্রায় 70% হ্রাস করে। কেন এই ক্ষেত্রে? মানে, ডেটা টেবিলের ফণার নীচে কী চলছে? আমি ব্যবহারের বিরুদ্ধে কোনও সতর্কতা দেখিনি &, তাই আমি আশ্চর্য হয়েছি যে পার্থক্যটি এত বড়। উভয় ক্ষেত্রেই তারা একই শর্তের মূল্যায়ন করে, যাতে কোনও পার্থক্য হওয়া উচিত নয়। অ্যান্ড কেসের ক্ষেত্রে, &একটি দ্রুত অপারেটর এবং তারপরে এটি কেবল একবার ডেটা টেবিলটি ফিল্টার করতে হবে (যেমন, এএনএস থেকে প্রাপ্ত লজিকাল ভেক্টর ব্যবহার করে), শৃঙ্খলার ক্ষেত্রে তিনবার ফিল্টার করার বিপরীতে।
বোনাস প্রশ্ন
এই নীতিটি কি সাধারণভাবে ডেটা টেবিল অপারেশনের জন্য ধারণ করে? মডুলারাইজিং কাজগুলি কি সর্বদা আরও ভাল কৌশল?
baseনিম্নলিখিতগুলি দিয়ে ভেক্টরগুলির সাথে অনুরূপ পর্যবেক্ষণ করতে পারেন : chain_vec <- function() { x <- which(a < .001); x[which(b[x] > .999)] }এবং and_vec <- function() { which(a < .001 & b > .999) }। (কোথা থেকে aএবং bএকই দৈর্ঘ্যের ভেক্টরগুলি runif- আমি n = 1e7এই কাট অফগুলির জন্য ব্যবহার করেছি )।