Skip to main content

Fast and lightweight set for unsigned 32 bits integers.

Project description

Documentation Status

An efficient and light-weight ordered set of 32 bits integers. This is a Python wrapper for the C library CRoaring.

Example

You can use a bitmap nearly as the classical Python set in your code:

from pyroaring import BitMap
bm1 = BitMap()
bm1.add(3)
bm1.add(18)
print("has 3:", 3 in bm1)
print("has 4:", 4 in bm1)
bm2 = BitMap([3, 27, 42])
print("bm1       = %s" % bm1)
print("bm2       = %s" % bm2)
print("bm1 & bm2 = %s" % (bm1&bm2))
print("bm1 | bm2 = %s" % (bm1|bm2))

Output:

has 3: True
has 4: False
bm1       = BitMap([3, 18])
bm2       = BitMap([3, 27, 42])
bm1 & bm2 = BitMap([3])
bm1 | bm2 = BitMap([3, 18, 27, 42])

Installation from Pypi

Supported systems: Linux, MacOS or Windows, Python 3.7 or higher. Note that pyroaring might still work with older Python versions, but they are not tested anymore.

To install pyroaring on your local account, use the following command:

pip install pyroaring --user

For a system-wide installation, use the following command:

pip install pyroaring

Naturally, the latter may require superuser rights (consider prefixing the commands by sudo).

If you want to use Python 3 and your system defaults on Python 2.7, you may need to adjust the above commands, e.g., replace pip by pip3.

Installation from conda-forge

Conda users can install the package from conda-forge:

conda install -c conda-forge pyroaring

(Supports Python 3.6 or higher; Mac/Linux/Windows)

Installation from Source

If you want to compile (and install) pyroaring by yourself, for instance to modify the Cython sources you can follow the following instructions. Note that these examples will install in your currently active python virtual environment. Installing this way will require an appropriate C compiler to be installed on your system.

First clone this repository.

git clone https://github.com/Ezibenroc/PyRoaringBitMap.git

To install from Cython via source, for example during development run the following from the root of the above repository:

python -m pip install .

This will automatically install Cython if it not present for the build, cythonise the source files and compile everything for you.

If you just want to recompile the package in place for quick testing you can try the following:

python setup.py build_clib
python setup.py build_ext -i

Note that the build_clib compiles croaring only, and only needs to be run once.

Then you can test the new code using tox - this will install all the other dependencies needed for testing and test in an isolated environment:

python -m pip install tox
tox

If you just want to run the tests directly from the root of the repository:

python -m pip install hypothesis
# This will test in three ways: via installation from source,
# via cython directly, and creation of a wheel
python test.py

Package pyroaring as an sdist and wheel. Note that building wheels that have wide compatibility can be tricky - for releases we rely on cibuildwheel to do the heavy lifting across platforms.

python -m pip install build
python -m build .

For all the above commands, two environment variables can be used to control the compilation.

  • DEBUG=1 to build pyroaring in debug mode.

  • ARCHI=<cpu-type> to build pyroaring for the given platform. The platform may be any keyword given to the -march option of gcc (see the documentation). Note that cross-compiling for a 32-bit architecture from a 64-bit architecture is not supported.

Example of use:

DEBUG=1 ARCHI=x86-64 python setup.py build_ext

Optimizing the builds for your machine (x64)

For recent Intel and AMD (x64) processors under Linux, you may get better performance by requesting that CRoaring be built for your machine, specifically, when building from source. Be mindful that when doing so, the generated binary may only run on your machine.

ARCHI=native pip install pyroaring  --no-binary :all:

This approach may not work under macOS.

Development Notes

Updating CRoaring

The download_amalgamation.py script can be used to download a specific version of the official CRoaring amalgamation:

python download_amalgamation.py v0.7.2

This will update roaring.c and roaring.h. This also means that the dependency is vendored in and tracked as part of the source repository now. Note that the __croaring_version__ in version.pxi will need to be updated to match the new version.

Tracking Package and CRoaring versions

The package version is maintained in the file pyroaring/version.pxi - this can be manually incremented in preparation for releases. This file is read from in setup.py to specify the version.

The croaring version is tracked in pyroaring/croaring_version.pxi - this is updated automatically when downloading a new amalgamation.

Benchmark

Pyroaring is compared with the built-in set and other implementations:

The script quick_bench.py measures the time of different set operations. It uses randomly generated sets of size 1e6 and density 0.125. For each operation, the average time (in seconds) of 30 tests is reported.

The results have been obtained with:

  • CPU Intel Xeon CPU E5-2630 v3

  • CPython version 3.5.3

  • gcc version 6.3.0

  • Cython version 0.28.3

  • pyroaring commit dcf448a

  • python-croaring commit 3aa61dd

  • roaringbitmap commit 502d78d

  • sortedcontainers commit 7d6a28c

operation

pyroaring

python-croaring

roaringbitmap

set

sortedcontainers

range constructor

3.09e-04

1.48e-04

8.72e-05

7.29e-02

2.08e-01

ordered list constructor

3.45e-02

6.93e-02

1.45e-01

1.86e-01

5.74e-01

list constructor

1.23e-01

1.33e-01

1.55e-01

1.12e-01

5.12e-01

ordered array constructor

5.06e-03

6.42e-03

2.89e-01

9.82e-02

3.01e-01

array constructor

1.13e-01

1.18e-01

4.63e-01

1.45e-01

5.08e-01

element addition

3.08e-07

8.26e-07

2.21e-07

1.50e-07

1.18e-06

element removal

3.44e-07

8.17e-07

2.61e-07

1.78e-07

4.26e-07

membership test

1.24e-07

1.00e-06

1.50e-07

1.00e-07

5.72e-07

union

1.61e-04

1.96e-04

1.44e-04

2.15e-01

1.11e+00

intersection

9.08e-04

9.48e-04

9.26e-04

5.22e-02

1.65e-01

difference

1.57e-04

1.97e-04

1.43e-04

1.56e-01

4.84e-01

symmetric diference

1.62e-04

2.01e-04

1.44e-04

2.62e-01

9.13e-01

equality test

7.80e-05

7.82e-05

5.89e-05

1.81e-02

1.81e-02

subset test

7.92e-05

8.12e-05

8.22e-05

1.81e-02

1.81e-02

conversion to list

4.71e-02

2.78e-01

4.35e-02

5.77e-02

5.32e-02

pickle dump & load

4.02e-04

6.27e-04

5.08e-04

2.41e-01

5.75e-01

“naive” conversion to array

5.12e-02

2.92e-01

4.75e-02

1.20e-01

1.18e-01

“optimized” conversion to array

1.27e-03

3.40e-02

nan

nan

nan

selection

1.77e-06

5.33e-05

1.14e-06

nan

1.64e-05

contiguous slice

9.38e-05

9.51e-05

6.99e-05

nan

2.04e-02

slice

2.88e-03

3.04e-01

1.00e-01

nan

4.74e-01

small slice

8.93e-05

3.00e-01

3.60e-03

nan

1.79e-02

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyroaring-0.4.5.tar.gz (152.8 kB view hashes)

Uploaded Source

Built Distributions

pyroaring-0.4.5-cp312-cp312-win_arm64.whl (163.5 kB view hashes)

Uploaded CPython 3.12 Windows ARM64

pyroaring-0.4.5-cp312-cp312-win_amd64.whl (202.6 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

pyroaring-0.4.5-cp312-cp312-musllinux_1_1_x86_64.whl (2.2 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

pyroaring-0.4.5-cp312-cp312-musllinux_1_1_aarch64.whl (1.9 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ ARM64

pyroaring-0.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

pyroaring-0.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

pyroaring-0.4.5-cp312-cp312-macosx_11_0_arm64.whl (267.8 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

pyroaring-0.4.5-cp312-cp312-macosx_10_9_x86_64.whl (322.2 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ x86-64

pyroaring-0.4.5-cp312-cp312-macosx_10_9_universal2.whl (585.2 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ universal2 (ARM64, x86-64)

pyroaring-0.4.5-cp311-cp311-win_arm64.whl (163.2 kB view hashes)

Uploaded CPython 3.11 Windows ARM64

pyroaring-0.4.5-cp311-cp311-win_amd64.whl (201.1 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

pyroaring-0.4.5-cp311-cp311-musllinux_1_1_x86_64.whl (2.2 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

pyroaring-0.4.5-cp311-cp311-musllinux_1_1_aarch64.whl (1.9 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ ARM64

pyroaring-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

pyroaring-0.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

pyroaring-0.4.5-cp311-cp311-macosx_11_0_arm64.whl (266.3 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

pyroaring-0.4.5-cp311-cp311-macosx_10_9_x86_64.whl (319.3 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

pyroaring-0.4.5-cp311-cp311-macosx_10_9_universal2.whl (580.8 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

pyroaring-0.4.5-cp310-cp310-win_arm64.whl (163.1 kB view hashes)

Uploaded CPython 3.10 Windows ARM64

pyroaring-0.4.5-cp310-cp310-win_amd64.whl (200.8 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

pyroaring-0.4.5-cp310-cp310-musllinux_1_1_x86_64.whl (2.1 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

pyroaring-0.4.5-cp310-cp310-musllinux_1_1_aarch64.whl (1.9 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ ARM64

pyroaring-0.4.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pyroaring-0.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

pyroaring-0.4.5-cp310-cp310-macosx_11_0_arm64.whl (266.1 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

pyroaring-0.4.5-cp310-cp310-macosx_10_9_x86_64.whl (318.7 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

pyroaring-0.4.5-cp310-cp310-macosx_10_9_universal2.whl (580.0 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

pyroaring-0.4.5-cp39-cp39-win_arm64.whl (163.4 kB view hashes)

Uploaded CPython 3.9 Windows ARM64

pyroaring-0.4.5-cp39-cp39-win_amd64.whl (200.8 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

pyroaring-0.4.5-cp39-cp39-musllinux_1_1_x86_64.whl (2.1 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

pyroaring-0.4.5-cp39-cp39-musllinux_1_1_aarch64.whl (1.9 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ ARM64

pyroaring-0.4.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pyroaring-0.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

pyroaring-0.4.5-cp39-cp39-macosx_11_0_arm64.whl (266.4 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

pyroaring-0.4.5-cp39-cp39-macosx_10_9_x86_64.whl (319.1 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

pyroaring-0.4.5-cp39-cp39-macosx_10_9_universal2.whl (580.7 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

pyroaring-0.4.5-cp38-cp38-win_amd64.whl (200.8 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

pyroaring-0.4.5-cp38-cp38-musllinux_1_1_x86_64.whl (2.2 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

pyroaring-0.4.5-cp38-cp38-musllinux_1_1_aarch64.whl (1.9 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ ARM64

pyroaring-0.4.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pyroaring-0.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

pyroaring-0.4.5-cp38-cp38-macosx_11_0_arm64.whl (265.5 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

pyroaring-0.4.5-cp38-cp38-macosx_10_9_x86_64.whl (318.1 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

pyroaring-0.4.5-cp38-cp38-macosx_10_9_universal2.whl (578.8 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

pyroaring-0.4.5-cp37-cp37m-win_amd64.whl (201.4 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

pyroaring-0.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl (2.1 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

pyroaring-0.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl (1.8 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ ARM64

pyroaring-0.4.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

pyroaring-0.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

pyroaring-0.4.5-cp37-cp37m-macosx_10_9_x86_64.whl (319.0 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page