- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
%in%
R 中的运算符检查是否有其他内容,这很明显。但我对性能很好奇。在 Python 中,搜索一个项目集合或字典键是 O(1),因为我认为集合是哈希表。但是在 Python 中搜索列表中的项目可能是 O(n) 和一个长度为 n 的列表,因为它将逐个元素搜索。那么如何%in%
在幕后为 R 中的不同数据类型工作?与向量相反,在 R 中的因子 dtype 中搜索某些内容似乎需要 5 倍的时间,但似乎是 %in%
线性搜索向量。起初我认为一个因子数据类型可能就像 Python 中的一个集合,因为它们都将某些东西减少到它的唯一值,但根本不是:https://www.tutorialspoint.com/r/r_data_types.htm .这是一些示例代码,因此您可以了解我对运行时的含义:
library(microbenchmark)
s <- seq(5000)
microbenchmark(1 %in% s, times = 100000)
# searching for a term further in the list takes longer
microbenchmark(4999 %in% s, times = 100000)
s <- as.factor(s)
# searching for something in a factor takes way longer than a vector
# I think because everything is converted to a character dtype
microbenchmark(4999 %in% s, times = 100000)
最佳答案
正如我们在评论中所讨论的那样,R 中有一个固有的类似集合的机制,尽管它确实有点骇人听闻,而且可能并不完全符合预期。 (这个 hack 的一些限制记录在 hashmap
包中。)
R 中的环境是内部散列的。这可用于存储具有随机访问(读取和写入)的任意对象。为了检查一些基准,我将生成几种类型的向量来证实您最初的关注并展示使用环境可以带来的改进。
我们将首先生成一些类似的数据,以各种方式排序以突出您提出的问题:
library(microbenchmark)
set.seed(2)
s1 <- seq(5000)
s2 <- rev(s1) # to highlight the bias you highlighted, since the vector is sorted
s3 <- sample(s1) # to shake things up a little
s4 <- as.character(s3) # comparison with character-based named in 'l' and 'e'
l <- list()
e <- new.env(parent = emptyenv())
for (i in s4) {
assign(i, TRUE, envir = e)
l[[i]] <- TRUE
}
head(names(l)) # unordered
# [1] "925" "3512" "2866" "840" "4716" "4713"
list
在其对象中确实具有序数,这支持其对象未被散列的假设:
which(names(l) == "1")
# [1] 2291
e[[1]]
# Error in e[[1]] : wrong arguments for subsetting an environment
NULL
之外的任何东西都足以满足我们的需求。我们将使用一个简单的
!is.null(e[[...]])
来测试特定的成员资格:
!is.null(e[["1"]])
# [1] TRUE
!is.null(e[["10000"]])
# [1] FALSE
!is.null(l[["1"]])
# [1] TRUE
!is.null(l[["10000"]])
# [1] FALSE
microbenchmark(
vec1 = 1 %in% s1,
vec2 = 1 %in% s2,
vec3 = 1 %in% s3,
vec4 = "1" %in% s4,
lst = is.null(l[["1"]]),
env = is.null(e[["1"]]),
times = 1000
)
# Warning in microbenchmark(vec1 = 1 %in% s1, vec2 = 1 %in% s2, vec3 = 1 %in% :
# Could not measure a positive execution time for 6 evaluations.
# Unit: nanoseconds
# expr min lq mean median uq max neval
# vec1 5835 6929 12493.25 7294 9482 3214588 1000
# vec2 9117 9847 16660.73 10212 12764 4081050 1000
# vec3 7294 8388 19983.63 8752 10576 3274759 1000
# vec4 11670 12400 15423.03 12764 14223 74394 1000
# lst 20787 21517 24561.72 21881 22975 143317 1000
# env 0 1 461.25 365 366 18235 1000
list
表现不佳,尽管它似乎比向量表现得更好(在
max
情况下,相对无意义)。同样不足为奇的是,根据我们声称环境使用内部 has 的说法,它表现得非常好。是 O(1) 吗?
microbenchmark(
samp5 = sapply(as.character(sample(5000, size = 5)), function(a) is.null(e[[a]])),
samp50 = sapply(as.character(sample(5000, size = 50)), function(a) is.null(e[[a]])),
samp500 = sapply(as.character(sample(5000, size = 500)), function(a) is.null(e[[a]])),
samp5000 = sapply(as.character(sample(5000, size = 5000)), function(a) is.null(e[[a]]))
)
# Unit: microseconds
# expr min lq mean median uq max neval
# samp5 25.893 32.4565 49.58154 40.4795 58.3485 169.573 100
# samp50 108.309 119.4310 156.45244 135.8410 167.3850 681.938 100
# samp500 935.750 1023.2715 1265.29732 1073.9610 1172.6055 6841.985 100
# samp5000 9410.008 10337.5520 11137.82968 10650.0765 11280.0485 15455.548 100
samp5
似乎需要更长的时间。这并不奇怪,因为存在与
sapply
、采样和其他事情相关的开销。然而,剩余的行似乎随着样本数量的增加而扩展得很好。这表明对于一些基本的集合操作确实是 O(1)。
sapply(...)
技巧,因为与向量和列表不同,R 的环境不允许使用向量进行子集化。
e[[c("1")]]
# [1] TRUE
e[[c("1","10")]]
# Error in e[[c("1", "10")]] :
# wrong arguments for subsetting an environment
hashmap
提出(并修复)的声明之一。
newset <- function() new.env(parent = emptyenv())
setadd <- function(set, n) set[[n]] <- TRUE
setdel <- function(set, n) set[[n]] <- NULL
setcontains <- function(set, n) !is.null(set[[n]])
setmembers <- function(set) names(set)
e <- newset()
setcontains(e, "a")
# [1] FALSE
setadd(e, "a")
setcontains(e, "a")
# [1] TRUE
setmembers(e)
# [1] "a"
setdel(e, "a")
setcontains(e, "a")
# [1] FALSE
关于r - R中%in%的时间复杂度;有没有办法让它像 Python 中的集合一样 O(1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47317333/
您好,我是使用 xampp 的 PHPmyadmin 新手,没有 MYSQL 背景。当我喜欢研究它是如何工作的时,我的脑海中浮现出一个想法,它让我一周都无法休眠,因为我似乎无法弄清楚如何使用 MIN(
Go docs say (强调): Programs using times should typically store and pass them as values, not pointers.
我有一组用户在 8 月 1 日有一个条目。我想找到在 8 月 1 日有条目但在 8 月 2 日没有做任何事情的用户。 现在是 10 月,所以事件已经过去很久了。 我有限的知识说: SELECT * F
我有以下代码,主要编码和取消编码时间结构。这是代码 package main import ( "fmt" "time" "encoding/json" ) type chec
您能详细解释一下“用户 CPU 时间”和“系统 CPU 时间”吗?我读了很多,但我不太理解。 最佳答案 区别在于时间花在用户空间还是内核空间。用户 CPU 时间是处理器运行程序代码(或库中的代码)所花
应用程序不计算东西,但做输入/输出、读取文件、使用网络。我希望探查器显示它。 我希望像 callgrind 中的东西一样,在每个问题中调用 clock_gettime。 或者像 oprofile 那样
目前我的 web 应用程序接收 websocket 数据来触发操作。 这会在页面重新加载时中断,因此我需要一个能够触发特定事件的客户端解决方案。 这个想法可行吗? 假设你有 TimeX = curre
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我有一个 Instant (org.joda.time.Instant) 的实例,我在一些 api 响应中得到它。我有另一个来自 (java.time.Instant) 的实例,这是我从其他调用中获得
如何集成功能 f(y) w.r.t 时间;即 'y'是一个包含 3000 个值和值 time(t) 的数组从 1 到 3000 不等。所以,在整合 f(y) 后我需要 3000 个值. 积分将是不确定
可以通过 CLI 创建命名空间,但是如何使用 Java SDK 来创建命名空间? 最佳答案 它以编程方式通过 gRPC API 完成由服务公开。 在 Java 中,生成的 gRPC 客户端可以通过 W
我有一个函数,它接受 2 组日期(开始日期和结束日期),这些日期将用于我的匹配引擎 我必须知道start_date1和end_date1是否在start_date2和end_date2内 快进:当我在
我想从 Python 脚本运行“time”unix 命令,以计算非 Python 应用程序的执行时间。我会使用 os.system 方法。有什么方法可以在Python中保存这个输出吗?我的目标是多次运
我正在寻找一种“漂亮的数字”算法来确定日期/时间值轴上的标签。我熟悉 Paul Heckbert's Nice Numbers algorithm . 我有一个在 X 轴上显示时间/日期的图,用户可以
在 PowerShell 中,您可以格式化日期以返回当前小时,如下所示: Get-Date -UFormat %H 您可以像这样在 UTC 中获取日期字符串: $dateNow = Get-Date
我正在尝试使用 Javascript 向父子窗口添加一些页面加载检查功能。 我的目标是“从父窗口”检测,每次子窗口完全加载然后执行一些代码。 我在父窗口中使用以下代码示例: childPage=wi
我正在尝试设置此 FFmpeg 命令的 drawtext 何时开始,我尝试使用 start_number 但看起来它不会成功。 ffmpeg -i 1.mp4 -acodec aac -keyint_
我收到了一个 Excel (2010) 电子表格,它基本上是一个文本转储。 单元格 - J8 具有以下信息 2014 年 2 月 4 日星期二 00:08:06 EST 单元格 - L8 具有以下信息
我收到的原始数据包含一列具有以下日期和时间戳格式的数据: 2014 年 3 月 31 日凌晨 3:38 单元格的格式并不一致,因为有些单元格有单个空格,而另一些单元格中有两个或三个字符之间的空格。所以
我想知道是否有办法在我的 Grails 应用程序顶部显示版本和构建日期。 编辑:我应该说我正在寻找构建应用程序的日期/时间。 最佳答案 在您的主模板中,或任何地方。 Server version:
我是一名优秀的程序员,十分优秀!