python - python3中的高效位交换

标签 python algorithm python-3.x bit-manipulation

我很难在 python3 中处理位交换。

到目前为止,我在 C 中找到了快速位交换算法 herehere ,但我无法将其正确转换为 python3,因为处理数据、使用正确的数据类型并且不被不同的编码混淆对我来说是不可能的。

对我有用的唯一解决方案是使用 BitArray 进行这样的交换:

with open(file_swapped, 'wb') as out, open(file, 'rb') as inp:
    byte_in = inp.read(1)
    while byte_in:
        tmp = bitstring.BitArray(byte_in)
        tmp.reverse()
        byte_out = tmp._getbytes()
        byte_in = inp.read(1)

然而,该算法需要超过 2 分钟来处理需要进行位交换的数据。对该算法的分析表明,创建 BitArray 占用了总时间的大部分。

每次尝试将二进制输入数据转换为“0”和“1”或整数的字符串,手动执行“交换”部分,都失败了,因为数据没有特定的编码(utf-8/utf- 16 没有工作)

这是我的 Input Data 的一个例子

有人知道完成上述任务的快速方法吗?

最佳答案

您可以尝试类似以下的方法。这使用 Python 的 bytes.maketrans()translate()功能。

def reverse_bits(x):
    return (int('{:08b}'.format(x)[::-1], 2))

reverse_table = bytes.maketrans(bytes(range(0,256)), bytes(reverse_bits(x) for x in range(0, 256)))

with open('input.txt', 'rb') as f_input, open('output.txt', 'wb') as f_output:
    data = f_input.read()
    f_output.write(data.translate(reverse_table))

这首先创建一个转换表,然后立即将其应用于整个输入文件的内容。

关于python - python3中的高效位交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33213592/

相关文章:

python - 如何让 Bottle 在文件更改时重新启动?

python - 根据参数实例化不同的子类

java - 如何改进此 Java 代码以在字符串中查找子字符串?

algorithm - 为 { 0 ^ (3 ^ n) | 构建枚举器(打印机)| n >=0} 最多有 10 个状态,包括打印和暂停,有限的字母表?

python - asyncio.ensure_future vs. BaseEventLoop.create_task vs. 简单协程?

python - 为什么这个列表理解比等效的生成器表达式更快?

python - 如何强制释放字典使用的内存?

c# - 用于生成 5 个变量中具有 2 个潜在值的所有组合的算法

python - PyautoGui 3.6 导入错误

python - 在 Pyspark 中评估分类器时,“SparkSession”对象没有属性 'serializer'