如何解决Common Lisp:读取流的最快方法
| 人们,在Common Lisp(SBCL)中读取流的最快方法是什么? 对我来说,这是读行。但是突然之间,我对这个功能的性能问题感到困惑-我应该在1.5秒内读取10kk个字符(每行1000个字符,每个字符10000个字符),但是读取行未能实现它。 Common Lisp有可能吗?是否提供C样式的scanf()函数以进行快速阅读? 谢谢! 更新。代码:(defun split (string)
(let ((space-position (position #\\Space string)))
(list
(subseq string 0 space-position)
(subseq string (+ space-position 1)))))
(defun solve (line)
(let ((nums (split line))
(first)
(second))
(setq first (parse-integer (car nums)))
(setq second (parse-integer (cadr nums)))
(* first second)))
(defun spoj()
(let ((N (read))
(line))
(dotimes (i N)
(setq line (read-line))
(format t \"~d~%\" (solve line))))))
(spoj)
解决方法
在不同的实现之间,面向文本的I / O的性能可能会相差很大,并且有助于提高一种实现的性能的策略可能不适用于另一种实现。您正在使用什么实现?
线是否保证长度相同?
对于它的价值,我尝试了一下您的练习(每行10,000个字符,共1,000行),用SBCL大约需要0.25秒的时间来阅读。
, 如果不进行概要分析,就不可能确切地说出您的瓶颈在哪里,但是我的猜测是
split
和solve
正在使您放慢脚步。具体来说,当您在字符串上调用ѭ3进行拆分时,最终会分配两个新字符串。由于parse-integer
可以将起始索引和结束索引带入字符串,因此无需进行拆分:
(let* ((space-position (position #\\Space string))
(first (parse-integer string :end space-position))
(second (parse-integer string :start (1+ space-position)))
(* first second))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。