- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我习惯将类似的任务集中到一行中。例如,如果我需要过滤 a
, b
, 和 c
在数据表中,我将它们放在一个 []
与 AND。昨天,我注意到在我的特殊情况下,这非常慢,而是测试了链接过滤器。我在下面提供了一个示例。
首先,我播种随机数生成器,加载 data.table ,并创建一个虚拟数据集。
# 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))
接下来,我定义我的方法。第一种方法将过滤器链接在一起。第二个 AND 将过滤器组合在一起。
# 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 由
reprex package (v0.3.0)
&
的警告,所以我很惊讶差异如此之大。在这两种情况下,他们评估相同的条件,所以这不应该是一个区别。在 AND 情况下,
&
是一个快速运算符,然后它只需要过滤一次数据表(即,使用 AND 产生的逻辑向量),而不是在链接情况下过滤三次。
最佳答案
大多数情况下,答案已经在评论中给出:data.table
的“链接方法”。在这种情况下比“anding 方法”更快,因为链接一个接一个地运行条件。随着每一步减小 data.table
的大小下一个要评估的就更少了。 “Anding”每次评估全尺寸数据的条件。
我们可以用一个例子来证明这一点:当单个步骤不减小 data.table
的大小时(即两种方法的检查条件相同):
chain_filter <- function(){
dt[a %between% c(1, 1000) # runs evaluation but does not filter out cases
][b %between% c(1, 1000)
][c %between% c(750, 760)]
}
# Anding method
and_filter <- function(){
dt[a %between% c(1, 1000) & b %between% c(1, 1000) & c %between% c(750, 760)]
}
bench
包,它会自动检查结果是否相同:
res <- bench::mark(
chain = chain_filter(),
and = and_filter()
)
summary(res)
#> # A tibble: 2 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 chain 299ms 307ms 3.26 691MB 9.78
#> 2 and 123ms 142ms 7.18 231MB 5.39
summary(res, relative = TRUE)
#> # A tibble: 2 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 chain 2.43 2.16 1 2.99 1.82
#> 2 and 1 1 2.20 1 1
data.table
的大小。 一步步。从理论上讲,链接方法甚至可能更慢(甚至将开销放在一边),即如果条件会增加数据的大小。但实际上我认为这是不可能的,因为
data.table
中不允许回收逻辑向量。 .我认为这回答了你的奖金问题。
bench
:
res <- bench::mark(
chain = chain_filter_original(),
and = and_filter_original()
)
summary(res)
#> # A tibble: 2 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 chain 29.6ms 30.2ms 28.5 79.5MB 7.60
#> 2 and 125.5ms 136.7ms 7.32 228.9MB 7.32
summary(res, relative = TRUE)
#> # A tibble: 2 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 chain 1 1 3.89 1 1.04
#> 2 and 4.25 4.52 1 2.88 1
关于r - 过滤数据表时链接 ANDing 的性能优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58557831/
这里是相关问题的片段 LEFT join tbl_ExpenseReportLineItem erli ON erh.ExpenseReportHeaderID = erli.ExpenseRepor
如果我有一个名称如下的数组。 如何打印“Hi joe and jack and john”? 当数组中只有一个名称时,该算法也应该有效。 #!/usr/bin/perl use warnings; u
如何在match的 ARM 中表达逻辑“和”? 如下所示: fn main() { let expr: Result = Ok(String::from("hello")); let
好吧,我正在尝试创建一个函数,该函数将获取一个项目列表并返回(不是打印!)该列表的字符串,在列表中的最后一个项目之前用逗号分隔,并用“and”分隔。到目前为止,我的脚本如下所示: rose1 = Th
我有一个类似这样的字符串: “q1”=“1”和“q2”=“2”或“q3”=“3” 我想把它分成一个数组: ['"q1"= "1"',' 和 ', '"q2"= "2"',' oR ','"q3"= "
我试图从解析服务器获取一个或多个具有特定年龄、来自特定城市和特定性别的用户,但此代码返回所有年龄为“20”、城市为“纽约”的用户, 性别=“女性” public void sendQuery() {
我有以下查询: SELECT * FROM students WHERE gwid NOT IN ( SELECT gwid FROM attendance WHERE((date='
我目前正在处理 3 个表。配方、成分和配方。这是经典的多对多情况,recipeIng 可以解决这个问题。 但是,我无法获得我认为的相当简单的“AND”查询。我想要实现的是一次搜索多种成分。例如: SE
我正在尝试创建一个搜索引擎系统。在 MySQL 语句中,我连接了名字和姓氏,并试图让用户匹配他们的名字和姓氏中的关键字母。如果他们的account_type = 0 和account_ban = 0,
好吧,我刚刚意识到 PHP 有一些奇怪的行为,想知道为什么会这样。所以运行这段代码: var_dump( true and false ? 'one' : 'two' ); 输出 boolean t
你好! 我正在尝试在运行时为数据网格构建自定义过滤器。 我正在使用 spring boot 和 vaadin 8 进行数据展示。 Vaadin 知识与此问题无关。 我是怎么做的: 我为过滤器构建了一个
我不明白为什么以下代码的行为方式如下: myand :: Bool -> Bool -> Bool myand True True = True myand _ _ = False containsA
我遇到了一段代码来计算十进制所需的二进制位数。 nbits = 1 + (decimal and floor(log2(decimal))) 我明白 1+floor(log2(decimal))返回
我得到了正确的输出: 需要我的输出看起来像这样: 本周的 7 个视觉词是 new、barn、shark、hold、art、only、和 眼睛。 本周的两个视觉词是减法,和 添加。 本周的 9 个视觉词
我的想法是,如果我将过滤掉更多行的 AND 放在过滤掉少数行的 AND 之前,我的查询应该运行得更快,因为 And 语句之间的选择集要小得多。 但是,SQL 语句的 WHERE 子句中 AND 的顺序
我习惯将类似的任务集中到一行中。例如,如果我需要过滤 a , b , 和 c在数据表中,我将它们放在一个 []与 AND。昨天,我注意到在我的特殊情况下,这非常慢,而是测试了链接过滤器。我在下面提供了
我们如何配置 flex 搜索,使其仅返回与搜索查询中所有单词匹配的结果。被索引的文档具有包含多个字段的数据,因此搜索查询的单词可能与数据的不同字段匹配,但结果中所有单词都必须匹配吗? 最佳答案 您可以
我有一个 SQL 表,其中有一列名为“国家/地区”,我想显示国家/地区名称 = UK 的详细信息,我尝试使用以下语句来执行此操作: select * from register_bs INNER JO
为什么这两段代码会产生不同的输出? $a = 3; ($a == 4) and print "But I wanted apple, cherry, or blueberry!\n"
给定一个列表 (a, b, c)创建字符串的最佳方法是什么,其中逗号分隔所有元素,除了最后一个用“和”分隔:a, b and c .理想情况下,这也适用于一元素和二元素列表。 最佳答案 在这种情况下,
我是一名优秀的程序员,十分优秀!