所以我有这段代码来检查目录中每个文件的文件类型。 只需要读取前4个字节并检查模式。
代码看起来有点复杂而且速度很慢,但我无法找到更快的方法在Nim中进行。
我做错了什么?
import os
var
buf {.noinit.}: array[4, char]
let out_pat = ['{', '\\', 'r', 't']
var
flag = true
num_read = 0
var dirname = "/some/path/*"
for path in walkFiles(dirname):
num_read = open(path).readChars(buf, 0, 4)
for i in 0..num_read-1:
if buf[i] != out_pat[i]:
flag = false
if flag:
echo path
flag = true
用于比较,Python代码快2倍:
def find_rtf(dir_):
for path in glob.glob(dir_):
with open(path,'rb') as f:
if f.read(4) == b'{\\rt':
print(path)
find_rtf("/some/path/*")
和常规cli比Python快约10倍但在遇到10 ^ 6 +文件时有一些管道错误
time find ./ -type f -print0 | LC_ALL=C xargs -0 -P 6 -n 100 head -c 5 -v| grep "{\\\rt" -B 1
答案 0 :(得分:4)
在我的系统(Linux)上,Nim版本的速度是Python版本的两倍。但也许我的文件是错的。你在用什么操作系统?
如果文件短于4个字节,您应该关闭文件并且比较错误。这是一个小小的清理:
import os
const
out_pat = ['{', '\\', 'r', 't']
dirname = "/some/path/*"
for path in walkFiles(dirname):
var buf: array[4, char]
let file = open(path)
defer: close(file) # Always close file when it goes out of scope
discard file.readChars(buf, 0, 4)
if buf == out_pat:
echo path
确保使用nim -d:release c foobar.nim
进行编译。
当您同时使用6个进程时,命令行版本会快得多。使用-P 1
代替-P 6
,它与我的Nim版本一样快。