如何在R语言中高效读写1万行标准输入输出?优化代码性能
R程序性能优化:快速处理32位整数对的绝对差计算
现有R程序功能为从标准输入读取32位整数对,计算两数绝对差后输出至标准输出,但在处理数千行数据时存在性能瓶颈,以下是基于原生函数的优化方案:
原始代码
input <- file('stdin', 'r') output <- stdout() while (length(line <- readLines(input, n=1)) > 0) { parts2 = strsplit(line, " ")[[1]] a = as.numeric(parts2[[1]]) b = as.numeric(parts2[[2]]) if (b > a) writeLines(paste0(b - a), output) else writeLines(paste0(a - b), output) }
性能瓶颈分析
原始代码的核心问题在于逐行循环处理+频繁IO操作:
- 每次仅读取1行输入,反复调用
readLines带来大量IO开销 - R的循环本身执行效率低,逐行拆分、转换、写入的单步操作累加后耗时显著
- 频繁调用
writeLines输出单行结果,进一步增加IO成本
优化方案
方案1:批量IO+向量化处理
利用R的向量/矩阵操作特性,一次性完成读取、计算、输出,避免循环:
# 一次性读取所有输入行,减少IO交互 input_lines <- readLines(file("stdin", "r")) # 批量拆分所有行的整数对,转换为数值矩阵 nums <- matrix(as.numeric(unlist(strsplit(input_lines, "\\s+"))), ncol = 2, byrow = TRUE) # 向量化计算绝对差(替代分支判断,更高效) diffs <- abs(nums[,1] - nums[,2]) # 批量写入结果,减少输出IO次数 writeLines(as.character(diffs), stdout())
方案2:用scan直接解析数值(极致优化)
scan是R中读取数值类数据的高效原生函数,可直接跳过字符串拆分步骤,从输入流中解析数值:
# 直接读取所有数值,自动处理空格/换行分隔,quiet=TRUE关闭日志输出 nums <- scan(file("stdin", "r"), what = numeric(), quiet = TRUE) # 按每2个元素一组转为矩阵 nums_matrix <- matrix(nums, ncol = 2, byrow = TRUE) # 计算绝对差并批量输出 writeLines(as.character(abs(nums_matrix[,1] - nums_matrix[,2])), stdout())
优化说明
- 批量IO:一次性读取所有输入、批量写入结果,将多次IO操作合并为1-2次,大幅降低IO开销
- 向量化操作:R的向量/矩阵操作底层由C实现,比R级循环快数倍甚至数十倍
- 避免冗余操作:用
abs()替代分支判断,用scan直接解析数值,减少中间转换步骤的耗时 - 类型兼容:
numeric类型(双精度浮点数)可精确表示32位整数,符合题目要求
内容的提问来源于stack exchange,提问作者Murilo Perrone
相关产品推荐
相关产品推荐

