为何在R中遍历数据框列比遍历同等向量耗时更长?
为什么遍历大型DataFrame元素比遍历同等向量慢?
我在R中处理一个包含2310000行的大型data frame时,发现直接遍历data frame列元素的循环速度极慢。为此我对比了遍历同等大小vector的耗时,测试代码如下:
df = data.frame(matrix(0, nrow = 2310000, ncol = 1)) t0 = Sys.time() # iterating on data frame df$var = 0 for (i in 1:100) { df$var[i] = 1 } t1 = Sys.time() # iterating on vector df$var = 0 v_var = df$var for (i in 1:100) { v_var[i] = 1 } df$var = v_var t2 = Sys.time() print(t1 - t0) ; print(t2 - t1)
测试输出:
Time difference of 0.1035166 secs
Time difference of 0.0075109 secs
核心原因解释
- DataFrame列访问有额外解析开销:DataFrame本质是向量组成的列表,但每次通过
df$var[i]访问元素时,R需要先从DataFrame的结构中定位到对应列向量,这个解析过程比直接访问独立向量多了一层查找逻辑,会产生额外耗时。 - 修改DataFrame会触发结构校验:修改
df$var[i]时,R会自动检查DataFrame的完整性,比如列长度是否匹配、数据类型是否一致等,这些校验步骤在操作独立向量时完全不存在。 - 列表索引的底层复杂度:DataFrame属于列表结构,其索引机制的底层实现比向量索引更复杂,需要处理更多属性与环境信息。单次操作的微小差异在循环中被放大,最终形成明显的时间差。
内容的提问来源于stack exchange,提问作者Cami
相关产品推荐
相关产品推荐

