>我有一个数据文件部分,看起来像
START
vertex 266.36 234.594 14.6145
vertex 268.582 234.968 15.6956
vertex 267.689 232.646 15.7283
END
START
vertex 166.36 23.594 4.6145
vertex 8.582 23.968 5.6956
vertex 67.689 32.646 1.7283
END
# [...]
即三个"顶点"的块。我现在想尽快读取数据。到目前为止,我正在逐一浏览这些行,
data = numpy.empty((n, 3))
flt = numpy.vectorize(float)
for k in range(n):
parts = f.readline().decode('utf-8').split()
assert len(parts) == 4
assert parts[0] == 'vertex'
data[k] = flt(parts[1:])
但这很慢。
有什么提示吗?
假设您刚刚使用了START
行,您可以尝试类似
>>> i = iter(file.__next__, 'ENDn')
>>> np.loadtxt(i, usecols=(1,2,3))
array([[266.36 , 234.594 , 14.6145],
[268.582 , 234.968 , 15.6956],
[267.689 , 232.646 , 15.7283]])
我假设loadtxt
相当快,但我不知道iter
的开销是多少。
首先,为什么需要从utf-8解码?您显示的数据意味着可能不需要。
想到的第二个想法是最后一行的数组切片。由于您已经检查了正好有 4 个项目,您计划跳过其中的第一个项目,具体取决于 numpy 的工作方式,是否可以选择说:
data[k] = (float(parts[1]), float(parts[2]), float(parts[3]))