对于快速数值计算,我经常使用NumPy。尽管NumPy是一个很好的工具,但它(显然)不是设置操作的好选择,因为NumPy适用于数组。甚至Python的内置集合对象也比使用NumPy进行集合操作要快得多:
的制备:将
# NumPy arrays
a = np.unique(np.random.randint(0, high=1000, size=1000))
b = np.unique(np.random.randint(0, high=1000, size=1000))
# Python's built-in set objects
sa = set(a)
sb = set(b)
设置交叉点:
# NumPy
timeit.timeit("np.intersect1d(a, b)", setup="from __main__ import a, b, np", number=10000)
> 1.3161415259819478
# Python
timeit.timeit("sa.intersection(sb)", setup="from __main__ import sa, sb", number=10000)
> 0.2791759959945921
设置差异:
# NumPy
timeit.timeit("np.setdiff1d(a, b)", setup="from __main__ import a, b, np", number=10000)
> 0.6135410660062917
# Python
timeit.timeit("sa - sb", setup="from __main__ import sa, sb", number=10000)
> 0.21169587498297915
设置联合:
# NumPy
timeit.timeit("np.union1d(a, b)", setup="from __main__ import a, b, np", number=10000)
> 0.4114252869854681
# Python
timeit.timeit("sa.union(sb)", setup="from __main__ import sa, sb", number=10000)
> 0.2402713909978047
当然这是没有代表性的,因为a
和b
包含随机整数......但我已经多次测试了这个,也有范围。 NumPy总是比Python的内置集合对象慢1.5到6倍。
此外,我猜NumPy的阵列在经常添加或删除元素时并不是很好。
问题:我目前正在使用通常包含超过10,000个元素的集合,有时甚至包含数百万个元素。另外,我经常添加或删除元素。
问题:在Python中是否有某种库可用于快速设置操作?有些库为预设编译操作提供API,比如NumPy用于数组/数值运算吗?