Skip to main content

Provides a sub-microsecond-precise thread-safe timer and helper methods to work with date and time data.

Project description

ataraxis-time

A Python library that provides a sub-microsecond-precise thread-safe timer and helper methods to work with date and time data.

PyPI - Version PyPI - Python Version uv Ruff type-checked: mypy PyPI - License PyPI - Status PyPI - Wheel


Detailed Description

This library uses the 'chrono' C++ library to access the fastest available system clock and use it to provide interval timing and delay functionality via a Python binding API. While the performance of the timer heavily depends on the particular system configuration and utilization, most modern CPUs should be capable of sub-microsecond precision using this timer. Due to using a C-extension to provide interval and delay timing functionality, the library is thread- and process-safe and releases the GIL when using the appropriate delay command. Additionally, the library offers a set of standalone helper functions that can be used to manipulate date and time data.

While the library was written to integrate with other Sun Lab projects, it can be used as a standalone library for non-lab projects with no additional modification.


Features

  • Supports Windows, Linux, and OSx.
  • Sub-microsecond precision on modern CPUs (~ 3 GHz+) during delay and interval timing.
  • Releases GIL during (non-blocking) delay timing even when using microsecond and nanosecond precision.
  • Pure-python API.
  • Fast C++ core with direct extension API access via nanobind.
  • GPL 3 License.

Table of Contents


Dependencies

For users, all library dependencies are installed automatically for all supported installation methods (see Installation section). For developers, see the Developers section for information on installing additional development dependencies.


Installation

Source

Note. Building from source may require additional build components to be available to compile the C++ portion of the library. It is highly recommended to install from PIP or CONDA instead.

  1. Download this repository to your local machine using your preferred method, such as git-cloning. Optionally, use one of the stable releases that include precompiled binary wheels in addition to source code.
  2. cd to the root directory of the project using your command line interface of choice.
  3. Run python -m pip install . to install the project. Alternatively, if using a distribution with precompiled binaries, use python -m pip install WHEEL_PATH, replacing 'WHEEL_PATH' with the path to the wheel file.
  4. Optionally, run the timer benchmark using benchmark-timer command from your command line interface (no need to use 'python' directive). You can use benchmark-timer --help command to see the list of additional configuration parameters that can be used to customize the benchmark behavior.

PIP

Use the following command to install the library using PIP: pip install ataraxis-time

Conda / Mamba

Note. Due to conda-forge contributing process being more nuanced than pip uploads, conda versions may lag behind pip and source code distributions.

Use the following command to install the library using Conda or Mamba: conda install ataraxis-time


Usage

Precision Timer

The timer API is intentionally minimalistic to simplify class adoption and usage. It is heavily inspired by the elapsedMillis library for Teensy and Arduino microcontrollers.

All timer class functionality is realized through a fast c-extension wrapped into the PrecisionTimer class. Primarily, the functionality comes through 3 class methods: reset(), elapsed (property) and delay():

Initialization and Configuration

The timer takes the 'precision' to use as the only initialization argument. All instances of the timer class are thread- and process-safe and do not interfere with each other. The precision of the timer can be adjusted after initialization if needed, which is more efficient than re-initializing the timer.

from ataraxis_time import PrecisionTimer

# Currently, the timer supports 4 'precisions: 'ns' (nanoseconds), 'us' (microseconds), 'ms' (milliseconds), and 
# 's' seconds.'
timer = PrecisionTimer('us')

# However, the precision can be adjusted after initialization if needed:
timer.set_precision('ms')  # Switches timer precision to milliseconds

Interval Timing

Interval timing functionality is realized through two methods: reset() and elapsed. This functionality of the class is identical to using perf_counter_ns() from 'time' library. The main difference from the 'time' library is that the class uses a slightly different interface (reset / elapsed) and automatically converts the output to the desired precision.

from ataraxis_time import PrecisionTimer
import time as tm

timer = PrecisionTimer('us')

# Interval timing example
timer.reset()  # Resets (re-bases) the timer
tm.sleep(1)  # Simulates work (for 1 second)
print(f'Work time: {timer.elapsed} us')  # This returns the 'work' duration using the precision units of the timer.

Delay

Delay timing functionality is the primary advantage of this class over the standard 'time' library. At the time of writing, the 'time' library can provide nanosecond-precise delays via a 'busywait' perf_counter_ns() loop that does not release the GIL. Alternatively, it can release the GIL via sleep() method, that is, however, only accurate up to millisecond precision (up to 16ms on some Windows platforms). PrecisionTimer class can delay for time-periods up to nanosecond precision (on some systems) while releasing or holding the GIL (depends on the method used):

from ataraxis_time import PrecisionTimer
import time as tm

timer = PrecisionTimer('us')

# GIL-releasing microsecond delays.
for i in range(10):
    print(f'us delay iteration: {i}')
    timer.delay_block(500)  # Delays for 500 microseconds, does not release the GIL

# Non-GIL-releasing milliseconds delay (uses sleep for millisecond delays to optimize resource usage).
timer.set_precision('ms')  # Switches timer precision to milliseconds
for i in range(10):
    print(f'ms delay iteration: {i}')
    timer.delay_noblock(500)  # Delays for 500 milliseconds, releases the GIL

Date & Time Helper Functions

These are minor helper methods that are not directly part of the timer class showcased above. Since these methods are not intended for realtime applications, they are implemented using pure python (slow), rather than fast c-extension method.

Convert Time

This helper method performs time-conversions, rounding to 3 Significant Figures for the chosen precision, and works with time-scales from nanoseconds to days.

from ataraxis_time.time_helpers import convert_time

# The method can convert single inputs...
initial_time = 12
time_in_seconds = convert_time(time=initial_time, from_units='d', to_units='s')  # Returns 1036800.0

# And Python iterables and numpy arrays
initial_time = np.array([12, 12, 12])
# Returns a numpy aray with all values set to 1036800.0 (uses float_64 format)
time_in_seconds = convert_time(time=initial_time, from_units='d', to_units='s')

Get Timestamp

This method is used to get timestamps accurate up to seconds. This is typically helpful when time-stamping file names and slow events.

from ataraxis_time.time_helpers import get_timestamp

# Obtains the current date and time and uses it to generate a timestamp that can be used in file-names (for example).
dt = get_timestamp(time_separator='-')  # Returns 2024-06-18-00-06-25 (yyyy-mm-dd-hh-mm-ss)

API Documentation

See the API documentation for the detailed description of the methods and classes exposed by components of this library. The documentation also covers the C++ source code and benchmark-timer command line interface command.


Developers

This section provides installation, dependency, and build-system instructions for the developers that want to modify the source code of this library. Additionally, it contains instructions for recreating the conda environments that were used during development from the included .yml files.

Installing the library

  1. Download this repository to your local machine using your preferred method, such as git-cloning.
  2. cd to the root directory of the project using your command line interface of choice.
  3. Install development dependencies. You have multiple options of satisfying this requirement:
    1. Preferred Method: Use conda or pip to install tox or use an environment that has it installed and call tox -e import to automatically import the os-specific development environment included with the source code in your local conda distribution. Alternatively, you can use tox -e create to create the environment from scratch and automatically install the necessary dependencies using pyproject.toml file. See environments section for other environment installation methods.
    2. Run python -m pip install .'[dev]' command to install development dependencies and the library. For some systems, you may need to use a slightly modified version of this command: python -m pip install .[dev].
    3. As long as you have an environment with tox installed and do not intend to run any code outside the predefined project automation pipelines, tox will automatically install all required dependencies for each task.

Note: When using tox automation, having a local version of the library may interfere with tox tasks that attempt to build the library using an isolated environment. While the problem is rare, our 'tox' pipelines automatically install and uninstall the project from its' conda environment. This relies on a static tox configuration and will only target the project-specific environment, so it is advised to always tox -e import or tox -e create the project environment using 'tox' before running other tox commands.

Additional Dependencies

In addition to installing the required python packages, separately install the following dependencies:

  1. Doxygen, if you want to generate C++ code documentation.
  2. An appropriate build tool or Docker, if you intend to build binary wheels via cibuildwheel (See the link for information on which dependencies to install).
  3. Python distributions, one for each version that you intend to support. Currently, this library supports 3.10, 3.11, and 3.12. The easiest way to get tox to work as intended is to have separate python distributions, but using pyenv is a good alternative too. This is needed for the 'test' task to work as intended.

Development Automation

This project comes with a fully configured set of automation pipelines implemented using tox. Check tox.ini file for details about available pipelines and their implementation. Alternatively, call tox list from the root directory of the project to see the list of available tasks.

Note! All commits to this project have to successfully complete the tox task before being pushed to GitHub. To minimize the runtime task for this task, use tox --parallel.

For more information, you can also see the 'Usage' section of the ataraxis-automation project documentation.

Environments

All environments used during development are exported as .yml files and as spec.txt files to the envs folder. The environment snapshots were taken on each of the three explicitly supported OS families: Windows 11, OSx (M1) 14.5 and Linux Ubuntu 22.04 LTS.

Note! Since the OSx environment was built against an M1 (Apple Silicon) platform and may not work on Intel-based Apple devices.

To install the development environment for your OS:

  1. Download this repository to your local machine using your preferred method, such as git-cloning.
  2. cd into the envs folder.
  3. Use one of the installation methods below:
    1. Preferred Method: Install tox or use another environment with already installed tox and call tox -e import.
    2. Alternative Method: Run conda env create -f ENVNAME.yml or mamba env create -f ENVNAME.yml. Replace 'ENVNAME.yml' with the name of the environment you want to install (axt_dev_osx for OSx, axt_dev_win for Windows, and axt_dev_lin for Linux).

Hint: while only the platforms mentioned above were explicitly evaluated, this project is likely to work on any common OS, but may require additional configurations steps.

Since the release of ataraxis-automation version 2.0.0 you can also create the development environment from scratch via pyproject.toml dependencies. To do this, use tox -e create from project root directory.

Automation Troubleshooting

Many packages used in 'tox' automation pipelines (uv, mypy, ruff) and 'tox' itself are prone to various failures. In most cases, this is related to their caching behavior. Despite a considerable effort to disable caching behavior known to be problematic, in some cases it cannot or should not be eliminated. If you run into an unintelligible error with any of the automation components, deleting the corresponding .cache (.tox, .ruff_cache, .mypy_cache, etc.) manually or via a cli command is very likely to fix the issue.


Versioning

We use semantic versioning for this project. For the versions available, see the tags on this repository.


Authors


License

This project is licensed under the GPL3 License: see the LICENSE file for details.


Acknowledgments

  • All Sun Lab members for providing the inspiration and comments during the development of this library.
  • My NBB Cohort for answering 'random questions' pertaining to the desired library functionality.
  • click project for providing the low-level command-line-interface functionality for this project.
  • tqdm project for providing an easy-to-use progress bar functionality used in our benchmark script.
  • numpy project for providing low-level functionality for our benchmark script.
  • elapsedMillis project for providing the inspiration for the API and the functionality of the timer class.
  • nanobind project for providing a fast and convenient way of binding c++ code to python projects.
  • The creators of all other projects used in our development automation pipelines see pyproject.toml.

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

ataraxis_time-2.0.0.tar.gz (76.8 kB view details)

Uploaded Source

Built Distributions

ataraxis_time-2.0.0-pp310-pypy310_pp73-win_amd64.whl (90.9 kB view details)

Uploaded PyPy Windows x86-64

ataraxis_time-2.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl (83.0 kB view details)

Uploaded PyPy macOS 11.0+ ARM64

ataraxis_time-2.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl (84.2 kB view details)

Uploaded PyPy macOS 10.15+ x86-64

ataraxis_time-2.0.0-cp312-abi3-win_arm64.whl (85.2 kB view details)

Uploaded CPython 3.12+ Windows ARM64

ataraxis_time-2.0.0-cp312-abi3-win_amd64.whl (90.8 kB view details)

Uploaded CPython 3.12+ Windows x86-64

ataraxis_time-2.0.0-cp312-abi3-win32.whl (86.7 kB view details)

Uploaded CPython 3.12+ Windows x86

ataraxis_time-2.0.0-cp312-abi3-macosx_11_0_arm64.whl (83.2 kB view details)

Uploaded CPython 3.12+ macOS 11.0+ ARM64

ataraxis_time-2.0.0-cp312-abi3-macosx_10_14_x86_64.whl (85.2 kB view details)

Uploaded CPython 3.12+ macOS 10.14+ x86-64

ataraxis_time-2.0.0-cp311-cp311-win_arm64.whl (86.7 kB view details)

Uploaded CPython 3.11 Windows ARM64

ataraxis_time-2.0.0-cp311-cp311-win_amd64.whl (92.8 kB view details)

Uploaded CPython 3.11 Windows x86-64

ataraxis_time-2.0.0-cp311-cp311-win32.whl (88.2 kB view details)

Uploaded CPython 3.11 Windows x86

ataraxis_time-2.0.0-cp311-cp311-macosx_11_0_arm64.whl (85.5 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

ataraxis_time-2.0.0-cp311-cp311-macosx_10_14_x86_64.whl (87.7 kB view details)

Uploaded CPython 3.11 macOS 10.14+ x86-64

ataraxis_time-2.0.0-cp310-cp310-win_arm64.whl (86.8 kB view details)

Uploaded CPython 3.10 Windows ARM64

ataraxis_time-2.0.0-cp310-cp310-win_amd64.whl (93.0 kB view details)

Uploaded CPython 3.10 Windows x86-64

ataraxis_time-2.0.0-cp310-cp310-win32.whl (88.3 kB view details)

Uploaded CPython 3.10 Windows x86

ataraxis_time-2.0.0-cp310-cp310-macosx_11_0_arm64.whl (85.7 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

ataraxis_time-2.0.0-cp310-cp310-macosx_10_14_x86_64.whl (87.8 kB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

File details

Details for the file ataraxis_time-2.0.0.tar.gz.

File metadata

  • Download URL: ataraxis_time-2.0.0.tar.gz
  • Upload date:
  • Size: 76.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for ataraxis_time-2.0.0.tar.gz
Algorithm Hash digest
SHA256 63ad5e31356beb2186d3893ad39c74372e162c47edf883276c151ac764b8d56d
MD5 6bc7f57482ffa0b9531e45b4bd3ec39a
BLAKE2b-256 cfd2a6bec3920c5a3275be08cd4ab7b5d26682a661479be4c484a93fca777657

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-pp310-pypy310_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-pp310-pypy310_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 80dc13611953bdc0a528af062810a156e7fbf434864310036d60c1b155a98e9e
MD5 b772c62f9937d41eee78c190b975f895
BLAKE2b-256 7cbdb75fffa33611fc7e77ed37a6adef0169b623d31597d4cf63935eea8ace7b

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5181ea822e99c79de8d28018978f0ea100dac5ec687cd365b3eabfe3ae16d3bd
MD5 32a977ac96c7402b87c643b13b7147e3
BLAKE2b-256 5d4087e740d3f1f46fe41ae36874c929294e5ae6e5152b69ae518d81d120ef25

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 2cf5116d82135f85f6f4e20390a89c2a970ef974554368485095f918ba7e7ccb
MD5 1177253cbf9b819ffece2da90783244e
BLAKE2b-256 0c74514fb2dc4757a282c87141f0dc234b4166e96c14b4db3492881273618897

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp312-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp312-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 b6cba65efe20abe0edad2357866bc39f51fe290cda4070a0ebb157373b822c21
MD5 a42237ede06b8a9f098dd3e77a07e702
BLAKE2b-256 0a8141dc90bdfbfa1286ea06aebf17f3a253d1bee8e1424d5d650853e02c51c6

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp312-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 48b3474f017dac9e624850af40c6b5eef976bb481c4540d6c6e1bc89798d3817
MD5 79a16d8321281e6fc9659c4ab3c1249d
BLAKE2b-256 a21f1bf6ee1f7c8d3a04bcef6ae9e37b66d523f9e5ad20167b4513539ad1d85d

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp312-abi3-win32.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp312-abi3-win32.whl
Algorithm Hash digest
SHA256 9d58e798f6fb5af89144bae37b65e602e78f37d3d8c4b0d31d81eaaf2d6da93a
MD5 da7c4107be2c030440ba262d5c04f847
BLAKE2b-256 79494426907b0c2ae3c80740e6b6468ff48fc56df934aa454396b19b3f41731c

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0f3ecbb4e3547cea7a0f9e9ce1989879ba8262d08c9fd2cbae0dbfcc8d7a022d
MD5 e9961a63c623865eef8a1aa863fd28bc
BLAKE2b-256 37476b89bb81196ba087ad2d06e9007a1b513ee699425377d0cfef184ca8a00f

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp312-abi3-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp312-abi3-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 66b0fa5cb97db90c43339e585a18d1d22dd762677e1c9af54e71c21dff8c7dbd
MD5 b46a2c517b8b102753ec81a804260810
BLAKE2b-256 54870a925d961dfa1c65885ba34aebc14cd1f43e5b9393dba847130beba0105c

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp311-cp311-win_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 9b2fd7f2627b92f14cd8d142165c95a022b23f10176ab891e7684e76d209771a
MD5 ee3e2dd0e0144d330f6d96e0d71b28f5
BLAKE2b-256 d94d129f71f8738aee379bf8f499a520beb33b2992c5e37cf84bdfb100096bc6

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4fda7a363b15bd79a439086e4ec9c6f74c45b8b908e21306b26edd3995466528
MD5 600e37adf8c53d17f89e5da5cdeb3783
BLAKE2b-256 4c42cce513dc2f9ac93733892a2297d4d62420f31d7c944394b34b967914c9a7

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp311-cp311-win32.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 688eda350870864753134053c0f19fd0983a6dcfcd187f6f0319c66a1144af94
MD5 0754902027da85123d811f059547f59e
BLAKE2b-256 6112f7fcbd63a0e27201d45854da4fa74c8ff931ced26b7a7a244a1d3f0cf810

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8c0cfa85f91ed13fd2cb53d9002b61a1f46f3e9cc4b04482dded25b47791cff5
MD5 4b327ac3d77b6b81c9e3c14feaad01be
BLAKE2b-256 f3e8c2ee83da9d383b1ebd452bdc14675acf7506dd6824c355e1d93c5f4bdc8c

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp311-cp311-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp311-cp311-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 fc45e4d60d372de368d035b72f0543c03ca9e425dd34327ddd0f1e2b8c1b73ee
MD5 00376998b4bfe966d95983789cdaaee5
BLAKE2b-256 a91be8f3ac0225c41464a3fc4cca107b256d48f98635b3139326be49c030d384

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp310-cp310-win_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp310-cp310-win_arm64.whl
Algorithm Hash digest
SHA256 945d27d1920c0045c0ff75cfe578d43f886317a0eaa2810f6cc156b3317b8934
MD5 f5cffc894f86b9683210e025311c0304
BLAKE2b-256 d9b9290ba917f91a55af14a04ea54b4a9bfe5afe1006b7121def759019b9ef62

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 88c912469c0a0aa6573f9e0e3ba62765c9b27b0f6f9a92bb690f541516a81051
MD5 b83ef16ae0f0aab79ec98b9487cf118f
BLAKE2b-256 ecc5060d7ec0ecd3961f4908cafdd8251ad6303fc0af37f95eca21f1c3737515

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp310-cp310-win32.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 dffc1968284720e6f1a2d2b68f1efc5dfe6a6048d33683df180a1a7bdbab95d7
MD5 b4749afa760438d2d426de4db76387bf
BLAKE2b-256 d436a255672b274460a8810f8bb9ffa4e026394f1fd60ff93145dcd6cae221a3

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 acc4c2838fc275f5f2ea7bee9ee57fed72e4820c9c6dc95e239fbf598d322c73
MD5 7e66274b7ac1602bee9ade97404081cd
BLAKE2b-256 410bbe93e01e1447dd8cc27e39464349013fb0fbfce070e7170a0ed06404756d

See more details on using hashes here.

File details

Details for the file ataraxis_time-2.0.0-cp310-cp310-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-2.0.0-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 acc4e53ab3314ad5a69b4e97bf6e11b040157bb6c8bbdde0ef8b37191892602f
MD5 ac9170ebac4704f2575aa7164adadd9c
BLAKE2b-256 636c8461b0aa84b96d84f9e817b302bd7f79e0a60dd3ecc0be37e430a9722c0d

See more details on using hashes here.

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