起因
我想用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库,欢迎告诉我。
参考资料:

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

被折叠的 条评论
为什么被折叠?



