Читает двоичный файл, содержащий периодические образцы


У меня есть следующий код для чтения ВК файлы. Приведенный ниже код работает абсолютно корректно (проверил это с помощью модульных тестов и выхода оригинального инструментария ВК).

from HTK_model import FLOAT_TYPE
from numpy import array
from struct import unpack

def feature_reader(file_name):
    with open(file_name, 'rb') as in_f:
        #There are four standard headers. Sample period is not used
        num_samples = unpack('>i', in_f.read(4))[0]
        sample_period = unpack('>i', in_f.read(4))[0]
        sample_size = unpack('>h', in_f.read(2))[0]
        param_kind = unpack('>h', in_f.read(2))[0]

        compressed = bool(param_kind & 02000)

        #If compression is used, two matrices are defined. In that case the values are shorts, and the real values are:
        # (x+B)/A
        A = B = 0
        if compressed:
            A = array([unpack('>f',in_f.read(4))[0] for _ in xrange(sample_size/2)], dtype=FLOAT_TYPE)
            B = array([unpack('>f',in_f.read(4))[0] for _ in xrange(sample_size/2)], dtype=FLOAT_TYPE)
            #The first 4 samples were the matrices
            num_samples -= 4

        for _ in xrange(0,num_samples):
            if compressed:
                yield ((array( unpack('>' + ('h' * (sample_size//2)),in_f.read(sample_size)) ,dtype=FLOAT_TYPE) + B) / A)
            else:
                yield (array( unpack('>' + ('f' * (sample_size//4)),in_f.read(sample_size)), dtype=FLOAT_TYPE))

Как я могу ускорить этот код, есть вещи, которые я должен улучшить в коде?



Комментарии
1 ответ

    data = in_f.read(12)
num_samples, sample_period, sample_size, param_kind = unpack('>iihh', data)
A = B = 0
if compressed:
A = array('f')
A.fromfile(in_f, sample_size/2)
B = array('f')
B.fromfile(in_f, sample_size/2)
#The first 4 samples were the matrices
num_samples -= 4

И так далее

3
ответ дан 28 марта 2011 в 12:03 Источник Поделиться