python 位运算 性能_python – 慢位运算

在开发一个涉及大量位运算的Python库时,作者发现内置的Python int类型的位运算速度竟然超过了numpy。通过对不同数据类型进行位运算的性能测试,包括numpy的int和bool数组,以及bitstring和bitarray库,结果显示Python的int类型在位运算速度上具有优势。作者寻求是否有可能使用其他Python库来进一步提升长位串的运算效率。
摘要由CSDN通过智能技术生成

我正在开发一个

Python库,它对长位字符串执行许多按位操作,我想找到一个能够最大化其速度的位串类型.我已经尝试了内置的Python int类型,numpy,

bitstring和

bitarray,而且令人惊讶的是,Python ints似乎在按位运算方面取得了成功.我用google搜索的所有内容都说numpy对于像这样的矢量化操作要快得多.我是不是以某种方式使用了numpy错误?我可以使用另一个Python库,它实际上改进了Python的内置int类型吗?

from timeit import timeit

import random

size = 10000

def int_to_bits(i):

result = []

for _ in range(size):

result.append(i % 2)

i >>= 1

return result

x = random.randrange(2**size)

y = random.randrange(2**size)

print(x.bit_length(), y.bit_length())

x_bits = int_to_bits(x)

y_bits = int_to_bits(y)

t = timeit(

stmt='a & b',

setup='a = %d; b = %d' % (x, y)

)

print("raw ints:", t)

t = timeit(

stmt='a & b',

setup=('import numpy;'

'a = numpy.array(%r, dtype=int);'

'b = numpy.array(%r, dtype=int)') % (x_bits, y_bits)

)

print('numpy int array:', t)

t = timeit(

stmt='a & b',

setup=('import numpy;'

'a = numpy.array(%r, dtype=bool);'

'b = numpy.array(%r, dtype=bool)') % (x_bits, y_bits)

)

print('numpy bool array:', t)

t = timeit(

stmt='a & b',

setup=('import numpy;'

'a = numpy.packbits(%r);'

'b = numpy.packbits(%r)') % (x_bits, y_bits)

)

print('numpy packed bits:', t)

t = timeit(

stmt='a & b',

setup=('import bitstring;'

'a = bitstring.BitString(%r);'

'b = bitstring.BitString(%r)') % (x_bits, y_bits)

)

print('bitstring:', t)

t = timeit(

stmt='a & b',

setup=('import bitarray;'

'a = bitarray.bitarray(%r);'

'b = bitarray.bitarray(%r)') % (x_bits, y_bits)

)

print('bitarray:', t)

结果:

10000 10000

raw ints: 0.29606562735373115

numpy int array: 7.400762747057885

numpy bool array: 1.1108355715984288

numpy packed bits: 1.3064737574273284

bitstring: 380.9796937642803

bitarray: 1.4451143449501842

编辑:

关于Python ints / longs上的单个操作如何与整个numpy位数组上的向量操作相比,似乎存在很多混淆.一个10,000位的Python int / long值,当被视为一个位掩码时(使用&运算符就像我们可以用int或C/C++中的long一样)可以直接比作长度为10,000的numpy bool数组,因为它们两者都包含相同数量的位,尽管以2种不同的方式表示.对于我尝试的表示10,000位的其他方式也是如此,包括使用numpy压缩位数组,numpy int数组和其他库中的位数组/字符串类型.它们都是可比较的,因为它们都在相同的位序列上计算相同的功能.这里最重要的是我可以表示所有10,000位,并且我可以对它们执行按位操作.如果任何人都可以建议一种更有效的方式来表示允许使用按位运算符(&,|和〜)的长,固定长度的位序列,那就是我正在寻找的.

如果你仍然对Python int / long值如何存储与numpy bool数组或numpy二进制值int数组相同的信息感到困惑,请参考上面代码中的int_to_bits函数;它演示了如何从Python int / long中提取位,这表明执行&两个10,000位int的操作基本上与在10,000个布尔值的列表或数组上逐个元素执行操作相同.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值