Битовые операции над большим количеством байтов

Выполняя некоторые упражнения с простым шифрованием/дешифрованием файлов, я сейчас просто читаю кучу байтов и выполняю соответствующие битовые операции с каждым байтом по одному, а затем записываю их в выходной файл.

Этот метод кажется довольно медленным. Например, если я хочу выполнить операцию XOR для каждого байта с помощью 0xFF, я бы перебрал каждый байт и выполнил операцию XOR с помощью 0xFF, вместо того, чтобы делать какую-то магию, и каждый байт быстро подвергается операции XOR.

Существуют ли лучшие способы выполнения битовых операций, а не побайтовых?


person MxLDevs    schedule 09.07.2011    source источник
comment
Как вы храните байты в данный момент? Как список целых чисел? И если у вас больше, скажем, дюжины МБ, очень маловероятно, что байтовое представление является источником замедления. Сначала измерьте (то есть профиль), прежде чем строить догадки.   -  person phihag    schedule 10.07.2011
comment
Вы уверены, что в тегах должно быть шифрование/дешифрование? Я не вижу никаких криптоопераций в вашем вопросе...   -  person Maarten Bodewes    schedule 14.07.2011


Ответы (2)


Несмотря ни на что, кажется, что каждый байт должен быть

  • читать по памяти,
  • каким-либо образом изменены и
  • записано обратно в память.

Вы можете сэкономить немного (без каламбура) времени, работая с несколькими байтами за раз, например, выполняя операцию XOR над целыми числами из 4 или даже 8 байтов, тем самым разделяя накладные расходы, связанные с управление циклом, примерно, в 4 или 8 раз, но это улучшение, скорее всего, не приведет к значительному выигрышу для алгоритма в целом.

Дополнительные улучшения можно найти, заменив «собственные» битовые операции (исключающее ИЛИ, сдвиги, повороты и т.п.) ЦП/языка чтением предварительно вычисленных значений в таблице. Однако имейте в виду, что эти собственные операции, как правило, довольно оптимизированы, и что вы должны очень усердно проектировать эквивалентные операции извне и точно измерять относительную производительность этих операций.

Редактировать: К сожалению, я только что заметил тег [Python], а также ссылку на numpy в другом ответе.
Осторожно... хотя предложение побитового массива Numpy правдоподобно, все зависит от фактических параметров рассматриваемой проблемы. Например, значительное количество времени может быть потеряно при выравнивании базовых массивов, подразумеваемых побитовой функцией numpy. См. этот вопрос о переполнении стека что кажется весьма актуальным. Хотя этот вопрос сосредоточен на операции XOR, он дает довольно много практических советов как для улучшения циклов и т. д., так и для профилирования в целом.

person mjv    schedule 09.07.2011

Использование побитовых операций с массивами из numpy может быть тем, что вы находясь в поиске.

person Whatang    schedule 09.07.2011