Comparaison entre Lua et Python
Bonjour.
Je commence l'apprentissage de LUA. Pour me faire la main, je traite la question de ce fil.
Comme je suis à l'aise en PYTHON, j'ai d'abord fait un programme uniq_seq.py :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
def keep_seq(filemane):
with open(filemane, "r") as fobj:
data = fobj.read().splitlines()
# Trie par ordre alphabétique
data.sort()
ref = data[0]
res = [ref]
for seq in data[1:]:
if seq.startswith(ref):
continue
ref = seq
res.append(ref)
return res
if __name__ == '__main__':
filemane = sys.argv[1]
print("\n".join(keep_seq(filemane))) |
Puis uniq_seq.lua :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #!/usr/bin/lua
local function read_file(filemane)
local arr = {}
local i = 0
local file = io.open(filemane, "r")
if file then
for line in file:lines() do
i = i + 1
arr[i] = line
end
end
io.close(file)
return arr
end
local filemane = arg[1]
local data = read_file(filemane)
-- Trie par ordre alphabétique
table.sort(data)
local ref = data[1]
local res = {ref}
local i = 1
for _, seq in ipairs(data) do
local pattern = string.format("^%s", ref)
_, n = string.gsub(seq, pattern, "")
if n == 0 then
ref = seq
i = i + 1
res[i] = ref
end
end
print(table.concat(res, "\n")) |
Lorsque je compare :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| time ./uniq_seq.py data/sorted_length_pool_piRNA_embryo_02h_GSM12.txt > benchmark/out_py
real 0m4.191s
user 0m3.648s
sys 0m0.504s
time ./uniq_seq.lua data/sorted_length_pool_piRNA_embryo_02h_GSM12.txt > benchmark/out_lua
real 0m27.840s
user 0m27.184s
sys 0m0.576s
diff benchmark/out_py benchmark/out_lua
(rien) |
Je suis déçu des performances de mon programme LUA. Une rapide analyse a montré qu'il n'y a pas de "point d'étranglement"; tout est plus lent.
Qu'est ce que je peux faire pour réduire le temps d'exécution ?