gpt4 book ai didi

scala - 一个比对应的python脚本慢很多的scala程序

转载 作者:行者123 更新时间:2023-12-01 22:57:26 25 4
gpt4 key购买 nike

我编写了一个简短的 Scala 程序来读取一个大文件,处理它并将结果存储在另一个文件中。该文件包含大约 60000 行数字,我只需要从每第三行中提取第一个数字。最终我将这些数字保存到不同的文件中。虽然是数字,但我一直将它们视为字符串。

这是Scala代码:

import scala.io.Source
import java.io.BufferedWriter
import java.io.FileWriter

object Analyze {
def main(args: Array[String]) {
val fname = "input.txt"

val counters = Source.fromFile(fname).mkString.split("\\n").grouped(3)
.map(_(2).split("\\s+")(0))

val f = new BufferedWriter(new FileWriter("output1.txt"))
f.write(counters.reduceLeft(_ + "\n" + _))
f.close()
}
}

我非常喜欢 Scala 强大的单衬的能力。上面代码中的 one-liner 从文件中读取整个文本,将其拆分为行,将行分组为 3 行为一组,然后从每组中取出第三行,将其拆分并取出第一个数字。

这是等效的python脚本:
fname = 'input.txt'

with file(fname) as f:
lines = f.read().splitlines()
linegroups = [lines[i:i+3] for i in range(0, len(lines), 3)]
nums = [linegroup[2].split()[0] for linegroup in linegroups]

with file('output2.txt', 'w') as f:
f.write('\n'.join(nums))

Python 没有这样一种衬垫。在上面的脚本中,第一行代码将文件读入一个行列表,下一行将这些行分成 3 组,下一行创建一个由每组最后一行的第一个数字组成的列表。它与 Scala 代码非常相似,只是运行速度要快得多。

python 脚本在我的笔记本电脑上运行只需几分之一秒,而 Scala 程序运行了 15 秒!我把保存结果到文件的代码注释掉了,时长降到了5秒,还是太慢了。我也不明白为什么将数字保存到文件中需要这么长时间。当我处理较大的文件时,python 脚本运行了几秒钟,而 Scala 程序的运行时间是几分钟,我无法用它来分析我的文件。

我会很感激你对这个问题的建议。
谢谢

最佳答案

我冒昧地清理了代码,这应该通过避免初始 mkString 来更有效地运行,不需要正则表达式来执行空格拆分,并且在写出结果之前不预先聚合结果。我还使用了更好的自我记录方法:

val fname = "input.txt"
val lines = (Source fromFile fname).getLines
val counters =
(lines grouped 3 withPartial false) map { _.last takeWhile (!_.isWhitespace) }

val f = new BufferedWriter(new FileWriter("output1.txt"))
f.write(counters mkString "\n")
f.close()

警告,未经测试的代码

不过,这在很大程度上无关紧要,具体取决于您的分析方式。如果您将 JVM 启动时间包含在您的指标中,那么所有的赌注都将关闭——再多的代码优化也无法帮助您。

我通常还建议在计时之前通过运行数百次例程来预热 JVM,但这在文件 I/O 面前并不实用。

关于scala - 一个比对应的python脚本慢很多的scala程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7017633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com