Найти - Пользователи
Полная версия: Производительность при работе с массивом байт.
Начало » Python для экспертов » Производительность при работе с массивом байт.
1
igor.kaist
Понадобилось работать с wav файлами, причем на pure python.
Задача: читать два файла, смикшировать их, и записать результат тоже в wav. Работать это будет на относительно слабом железе. Си расширения недоступны.
Судя по результатам profile, основной тормоз происходит не на IO, а на строчку,которая работает со списком байт, полученных с помощью struct:
s=struct.unpack('1024B',wave.readframes(1024))
s2=struct.unpack('1024B',wave2.readframes(1024))
out_wave.writeframes(struct.pack('1024B',*[((x+y)//2) for x,y in zip(s,s2)]))
Это самый быстрый вариант,который у меня получился.
Можно ли как то это все еще оптимизировать?
o7412369815963
можно попробовать убрать лишний zip, что-то типа этого:
slen = max(len(s),len(s2))
[((s[x]+s2[x])//2) for x in xrange(slen)]
в данном случае zip проходит по обоим массивам и создает ещё один толстый массив, потом мы перебираем полученный массив. а без зипа сразу перебираем исходные массивы.
Slava
На array немного быстрее
s    = array.array('B')
s2 = array.array('B')
res = array.array('B')
s.fromstring(wave.readframes(1024))
s2.fromstring(wave2.readframes(1024))
res.extend((x+y)//2 for x, y in izip(s, s2))
out_wave.writeframes(res.tostring())
igor.kaist
o7412369815963, спасибо… что то я ступил :)
Slava, пробовал уже вариант с array, получается медленнее процентов на 10 :(
pyuser
o7412369815963
slen = max(len(s),len(s2))
тогда уж min, иначе ведь index out of range получить можно
o7412369815963
pyuser
o7412369815963
slen = max(len(s),len(s2))
тогда уж min, иначе ведь index out of range получить можно
да, точно :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB