大量字节上的位运算
我正在做一些简单的文件加密和解密练习,目前的做法是逐个读取字节,然后对每个字节进行相应的位操作,最后把处理后的结果写入输出文件。
这种方法似乎有点慢。比如说,如果我想把每个字节都和0xFF进行异或运算,我就得一个字节一个字节地循环处理,而不是用什么特别的技巧让所有字节都能快速完成异或运算。
有没有更好的方法来进行位操作,而不是一个字节一个字节地处理呢?
2 个回答
7
你可以试试使用 numpy
中的 位运算数组操作,这可能正是你需要的。
3
无论如何,每个字节都必须进行以下操作:
- 从内存中读取,
- 以某种方式进行修改,
- 然后再写回内存。
你可以通过一次处理多个字节来节省一些时间,比如对4个或8个字节的整数进行异或(XOR)操作,这样可以大约把循环管理的开销减少4倍或8倍,但这个改进可能对整体算法的提升并不大。
另外,你还可以通过用预先计算好的值替代CPU/语言的“原生”位操作(比如异或、位移、旋转等)来进一步优化。不过要注意,这些原生操作通常已经经过很好的优化,所以在设计外部等效操作时需要非常小心,并且要准确测量这些操作的相对性能。
编辑:哎呀,我刚注意到有[Python]
标签,还有其他回答中提到的numpy。
要小心……虽然使用Numpy的位运算数组的建议听起来不错,但这完全取决于具体问题的实际参数。例如,使用numpy的位运算函数可能会在对齐底层数组时浪费不少时间。可以参考这个Stack Overflow的问题,它似乎很相关。虽然主要关注于异或操作,但这个问题提供了很多可行的建议,可以帮助你改进循环等,以及进行性能分析。