Python中bitmap数据结构的构造和使用

为了提高B站用户爬虫的效率,通过比较ID是否已爬取,作者探讨了两种解决方案:自定义bitmap和使用集合。文章详细介绍了如何在Python中利用bitarray库构造bitmap,以及对比了集合的便利性,尽管它占用更多空间。同时,提到了Python2的bitmap库,但推荐使用Python3的bitarray库以节省空间并提升速度。

起因

我想用bitmap的原因是因为我写了一个B站用户的爬虫,是通过关系网进行爬取的,所以我需要确定一个ID是否已经被爬取过。B站ID的规则是从1开始递增的数字,现在最大的ID接近4亿了。所以我的程序运行到后面时非常慢,因为要比较一个ID是否存在50万个ID的列表里,也就是比较一个数字是否存在于一个存有大量数字的列表中
我共有3个解决方案,分别是自己实现bitmap,使用集合。

解决方案1:构造bitmap

因为Python不像C语言一样可以直接使用bit,在Python中如果要操作bit需要安装额外的库,我选择的是bitarray: anaconda自带了bitarray这个库,这个库的详细介绍:bitarray · PyPI
Linux下库的安装:

apt install python3-bitarray

使用方法如下:

>>> from bitarray import bitarray
>>> a = bitarray()            # create empty bitarray
>>> a.append(True)
>>> a.extend([False, True, True])
>>> a
bitarray('1011')

我构造了一个bitmap的类:

class BitMap:
    def __init__(self, size):
        self.size = size
        self.array = bitarray(size)
        self.array.setall(0)

    def set(self, index):
        self.array[index] = 1

    def test(self, index):
        if self.array[index] == 0:
            return False
        else:
            return True

使用方法如下:

bitmap = BitMap(4*10)
bitmap.set(1)
if bitmap.test(1) == True:
	print(bitmap.array)

解决方案2:集合

判断一个ID是否出现过的一个比较好的办法是使用集合,Python自带集合set,使用集合确实是很方便的一件事,但是因为我想到直接构造bitmap更省空间更快,我就没有使用集合了。

题外话

Python2有一个bitmap的库,但是并不好用,感兴趣的可以用一下,安装方法和使用方法如下:

pip install bitmap
from bitmap import BitMap
bm = BitMap(32)
print bm.tostring()
bm.set(1)
print bm.test(1)
print bm.tostring()

更详细的说明见bitmap · PyPI
如果有好用的Python3的bitmap库,欢迎告诉我。

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值