1

これが私のプログラムです。

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")を見る必要がありますか?

4

3 に答える 3

1

高速かどうかはわかりませんが、read("*n")はるかに簡単です...

local t = { }
while true do
    local n = io.stdin:read("*n")
    if n == nil then break end
    table.insert ( t , n )
end
于 2013-02-26T03:15:15.623 に答える
1

ファイル サイズが 16MB の場合、ロード ルーチンのパフォーマンスはファイル IO によって支配されます。ロードされたデータを処理するのにかかる時間は、通常、次に重要ではありません。

やってみなよ; ファイルをロードするのにかかる時間をプロファイリングし ( io.read. 後者はもっと長くなりますが、それは比較的小さなパーセンテージであり、膨大な量ではありません.

ファイル全体を一度にロードする方法は、少しずつ行うよりもほぼ確実に高速です。ファイルシステムは、一度に少しずつではなく、データのブロック全体を一度に読み取るのが好きです。それを超えて、テキストを処理する方法は比較的重要ではありません。

于 2013-02-26T02:40:10.377 に答える
0

おそらく、これはより速いでしょう:

local t = {}
local match = string.match
for line in io.lines() do
   t[#t+1] = match(line, '%d+')
end

文字列を数値に変換することを忘れないでください。

于 2013-02-26T02:03:55.063 に答える