Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 17, 2010 12:10:46

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Производительность при работе с массивом байт.

Понадобилось работать с 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)]))
Это самый быстрый вариант,который у меня получился.
Можно ли как то это все еще оптимизировать?



Офлайн

#2 Фев. 17, 2010 13:15:57

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Производительность при работе с массивом байт.

можно попробовать убрать лишний zip, что-то типа этого:

slen = max(len(s),len(s2))
[((s[x]+s2[x])//2) for x in xrange(slen)]
в данном случае zip проходит по обоим массивам и создает ещё один толстый массив, потом мы перебираем полученный массив. а без зипа сразу перебираем исходные массивы.

Отредактировано (Фев. 17, 2010 13:17:45)

Офлайн

#3 Фев. 17, 2010 13:16:13

Slava
От:
Зарегистрирован: 2009-11-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Производительность при работе с массивом байт.

На 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())



Офлайн

#4 Фев. 17, 2010 13:52:32

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Производительность при работе с массивом байт.

o7412369815963, спасибо… что то я ступил :)
Slava, пробовал уже вариант с array, получается медленнее процентов на 10 :(



Офлайн

#5 Фев. 18, 2010 03:40:19

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Производительность при работе с массивом байт.

o7412369815963
slen = max(len(s),len(s2))
тогда уж min, иначе ведь index out of range получить можно



Офлайн

#6 Фев. 18, 2010 05:25:13

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Производительность при работе с массивом байт.

pyuser
o7412369815963
slen = max(len(s),len(s2))
тогда уж min, иначе ведь index out of range получить можно
да, точно :)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version