对于基本R中的循环-双括号如何工作(并导致处理速度的提高)?
我一直在尝试为循环构建一个基本的R对于基本R中的循环-双括号如何工作(并导致处理速度的提高)?,r,performance,for-loop,R,Performance,For Loop,我一直在尝试为循环构建一个基本的R,我可以与其他R包函数一起加速测试 不幸的是,我在理解1)for循环必须如何构造,2)语法差异如何导致处理速度的显著变化,以及3)前两个问题是否有某种关联方面似乎存在差距。我所受的教育从未涉及到这些问题。我能找到的所有资源都不能解释实证结果 例如,让我们取一个种子的随机数据框,填充的值在1到5之间。所有大于4的值都将替换为零。对于具有不同括号结构的循环,我使用四种排列的,以便找到所有大于4的值,并用零替换它们。 其中三个完全用于循环,在使用了多少个双括号以及由此
,我可以与其他R包函数一起加速测试
不幸的是,我在理解1)for循环必须如何构造,2)语法差异如何导致处理速度的显著变化,以及3)前两个问题是否有某种关联方面似乎存在差距。我所受的教育从未涉及到这些问题。我能找到的所有资源都不能解释实证结果
例如,让我们取一个种子的随机数据框,填充的值在1到5之间。所有大于4的值都将替换为零。对于具有不同括号结构的
循环,我使用四种排列的,以便找到所有大于4的值,并用零替换它们。
其中三个完全用于循环,在使用了多少个双括号以及由此产生的速度增加之间,有一个有趣的关系
据我所知,这不是关于静默整数强制。
括号计数之间的速度差完全独立于它们是否以整数或双精度开始,或作为整数或双精度进行测试,或被替换为整数或双精度,以及上述所有组合。我对所有这些进行了测试,发现所有这些变化对最终速度的影响明显小于括号内的变化
为什么使用的括号数量会导致这些速度变化?
还有一个可能更简单的问题:为什么在“测试/过滤”向量中使用双括号的版本不起作用?-即使完全忽略它,或者在前面添加另一个双括号也会导致它起作用
请在下面找到我的示例代码:
set.seed(24)
# Numeric Dataframe
df_numeric_orig <- as.data.frame(matrix(sample(c(1:5), 1e6 *12, replace=TRUE),
dimnames = list(NULL, paste0("var", 1:12)), ncol=12))
## No Double Brackets
df_num <- df_numeric_orig
NumDF_NoSetsDbleBrackets <-
system.time({
for(row in 1:ncol(df_num)) {
df_num[row][(df_num[row] > 4)] <- 0
}
})
# 1 set Double Brackets - Front
df_num <- df_numeric_orig
NumDF_1SetDbleBrackets_front <-
system.time({
for(row in 1:ncol(df_num)) {
df_num[[row]][(df_num[row] > 4)] <- 0
}
})
# 1 set Double Brackets - Back
df_num <- df_numeric_orig
NumDF_1SetDbleBrackets_back <-
system.time({
for(row in 1:ncol(df_num)) {
df_num[row][(df_num[[row]] > 4)] <- 0
}
})
# 2 set Double Brackets
df_num <- df_numeric_orig
NumDF_2SetDbleBrackets <-
system.time({
for(row in 1:ncol(df_num)) {
df_num[[row]][(df_num[[row]] > 4)] <- 0
}
})
NumDF_NoSetsDbleBrackets
NumDF_1SetDbleBrackets_front
NumDF_1SetDbleBrackets_back
NumDF_2SetDbleBrackets
为每个对象编制索引后,尝试对其使用class
<代码>类(mtcars[1])
与类(mtcars[[1]])
也许可以阅读本文来了解区别:我与Zelazny7讨论数据帧中固有的开销,而不是原子向量。另外,根本不运行的是因为df_num[row]
返回一个单列数据帧。以同样的方式,使用单括号对其进行索引,试图选择另一个列集合。但是您只有一列,而您似乎认为[df_num[[row]]>4]
将作为向量作用于其余的列。@MrFlick-Aha!看起来子集是我应该搜索的词。现在读起来。
The speed results on my machine typically come out about as below:
> NumDF_NoSetsDbleBrackets
user system elapsed
0.41 0.13 0.55
> NumDF_1SetDbleBrackets_front
user system elapsed
0.25 0.10 0.35
> NumDF_1SetDbleBrackets_back
Error: object 'NumDF_1SetDbleBrackets_back' not found
> NumDF_2SetDbleBrackets
user system elapsed
0.23 0.05 0.29