Чтение структурированных данных с помощью начального / конечного тегов - PullRequest
0 голосов
/ 19 мая 2018

У меня есть файл данных, части которого выглядят как

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:])

, но это довольно медленно.

Есть какие-нибудь намеки?

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Предполагая, что вы только что использовали строку START, вы можете попробовать что-то вроде

>>> i = iter(file.__next__, 'END\n')
>>> 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 есть.

0 голосов
/ 19 мая 2018

Во-первых, зачем нужно декодировать из utf-8?Данные, которые вы показываете, подразумевают, что они могут и не понадобиться.

Вторая мысль, которая приходит на ум, - это разрезание массива в последней строке.Поскольку вы уже проверили, что существует ровно 4 элемента, из которых вы планируете пропустить первый, в зависимости от того, как работает numpy, возможно, будет предложено сказать:

data[k] = (float(parts[1]), float(parts[2]), float(parts[3]))
...