这是我的程序。
local t = {}
local match = string.gmatch
local insert = table.insert
val = io.read("*a")
for num in match(val, "%d+") do
insert(t, num)
end
我想知道是否有比这更快的方法来加载大型(16MB+)整数数组。考虑到数据由单个数字的一行一行组成,这可以更快吗?我应该看 io.read("*n") 吗?
鉴于您的文件大小为 16MB,您的加载例程的性能将由文件 IO 主导。处理加载的数据需要多长时间通常与此无关。
就试一试吧; 分析加载文件需要多长时间(之后停止脚本io.read
),然后分析整个脚本需要多长时间。后者会更长,但只会占相对较小的百分比,而不是大量。
以您正在做的方式一次加载整个文件几乎肯定会比零碎地加载更快。文件系统喜欢一次读取整个数据块,而不是一次读取位。除此之外,如何处理文本相对无关紧要。
我不确定它是否更快,但read("*n")
更简单......
local t = { }
while true do
local n = io.stdin:read("*n")
if n == nil then break end
table.insert ( t , n )
end
可能,这会更快:
local t = {}
local match = string.match
for line in io.lines() do
t[#t+1] = match(line, '%d+')
end
不要忘记将字符串转换为数字。