You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:40:21