Skip to main content

Provides a high-precision thread-safe timer and helper methods to work with date and time data.

Project description

ataraxis-time

Provides a high-precision 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, delay, timeout, and polling 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 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 configuration. Additionally, the library offers a set of standalone helper functions for manipulating date and time data, including timestamp generation and parsing, time-unit conversion, rate-interval conversion, and timedelta interoperability.

Features

  • Supports Windows, Linux, and macOS.
  • 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.
  • Timeout guard class for activity-based and duration-based timeout tracking.
  • Lap recording, human-readable elapsed time formatting, and periodic polling via an infinite generator.
  • Frequency-to-interval and interval-to-frequency conversion helpers.
  • Timestamp generation, conversion, and parsing with configurable precision levels.
  • Interoperability with Python datetime.timedelta objects.
  • Apache 2.0 License.

Table of Contents


Dependencies

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


Installation

Source

Note, installation from source is highly discouraged for anyone who is not an active project developer.

  1. Download this repository to the local machine using the preferred method, such as git-cloning. Use one of the stable releases that include precompiled binary and source code distribution (sdist) wheels.
  2. If the downloaded distribution is stored as a compressed archive, unpack it using the appropriate decompression tool.
  3. cd to the root directory of the prepared project distribution.
  4. Run pip install . to install the project and its dependencies.

pip

Use the following command to install the library and all of its dependencies via pip: pip 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 class wrapped into the PrecisionTimer class.

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.

from ataraxis_time import PrecisionTimer, TimerPrecisions

# Currently, the timer supports 4 precisions: 'ns' (nanoseconds), 'us' (microseconds), 'ms' (milliseconds), and
# 's' (seconds). All precisions are defined in the TimerPrecisions enumeration.
timer = PrecisionTimer(TimerPrecisions.MICROSECOND)
print(f"Precision: {timer.precision}")

# The precision can be adjusted after initialization if needed. While not recommended, it is possible to provide the
# precision as a string instead of using the TimerPrecisions enumeration.
timer.set_precision('ms')  # Switches timer precision to milliseconds
print(f"Precision: {timer.precision}")

Interval Timing

Interval timing functionality is realized through two methods: reset() and the elapsed property. This functionality is identical to using perf_counter_ns() from the 'time' library. The main difference is that PrecisionTimer 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')

Delay

Delay timing functionality is the primary advantage of this library over the standard 'time' library. At the time of writing, the 'time' library can provide nanosecond-precise delays via a 'busywait' perf_counter_ns() function that does not release the GIL. Alternatively, it can release the GIL via the sleep() function, but it is only accurate up to millisecond precision. The PrecisionTimer class can delay for time-periods within microsecond precision, while releasing or holding the GIL.

import threading
import time
from ataraxis_time import PrecisionTimer

# Instantiates a global counter for the background thread
counter = 0
stop = False


def count_in_background():
    """Background thread that increments the global counter."""
    global counter
    while not stop:
        counter += 1


# Setup
timer = PrecisionTimer('us')

# Starts the background counter thread
thread = threading.Thread(target=count_in_background, daemon=True)
thread.start()
time.sleep(0.1)

# GIL-releasing microsecond delay:
print("block=False (releases GIL):")
counter = 0  # Resets the counter
timer.delay(100, block=False)  # 100us delay
non_blocking_count = counter
print(f"counter = {counter}")

# Non-GIL-releasing microsecond delay:
print("block=True (holds GIL):")
counter = 0  # Resets the counter
timer.delay(100, block=True)  # 100us delay
blocking_count = counter
print(f"counter = {counter}")

# Cleanup
stop = True

# With microsecond precisions, blocking runtime often results in the counter not being incremented at all.
if blocking_count == 0:
    blocking_count = 1
print(f"Difference: block=False allows ~{non_blocking_count/blocking_count:.0f}x more counting!")
thread.join()

Lap Timing

The lap() method records the current elapsed time, appends it to an internal list, and resets the timer. All recorded lap times are accessible through the laps property.

from ataraxis_time import PrecisionTimer
import time as tm

timer = PrecisionTimer('ms')

# Records three laps
for i in range(3):
    tm.sleep(0.1)  # Simulates work
    duration = timer.lap()
    print(f"Lap {i + 1}: {duration} ms")

# Retrieves all recorded laps as a tuple
print(f"All laps: {timer.laps}")

Formatted Elapsed Time

The format_elapsed() method returns the current elapsed time as a human-readable string, automatically selecting the most appropriate units.

from ataraxis_time import PrecisionTimer
import time as tm

timer = PrecisionTimer('us')
tm.sleep(2.5)  # Simulates work
print(f"Elapsed: {timer.format_elapsed()}")  # e.g. "2 s 500.117 ms"
print(f"Detailed: {timer.format_elapsed(max_fields=3)}")  # e.g. "2 s 500 ms 117.0 us"

Polling

The poll() method provides an infinite generator that yields an iteration count after each delay cycle. This is useful for periodic task execution.

from ataraxis_time import PrecisionTimer

timer = PrecisionTimer('ms')

# Polls every 100 ms, runs 10 iterations
for count in timer.poll(100):
    print(f"Iteration {count}")
    if count >= 10:
        break

Timeout

The Timeout class provides a timeout guard built on PrecisionTimer. It supports checking whether a specified duration has elapsed and offers activity-based reset (kick) and full reset with optional duration changes.

from ataraxis_time import Timeout
import time as tm

# Creates a 500 ms timeout
timeout = Timeout(duration=500, precision='ms')

# Checks timeout status
tm.sleep(0.1)
print(f"Expired: {timeout.expired}")  # False
print(f"Remaining: {timeout.remaining} ms")
print(f"Elapsed: {timeout.elapsed} ms")

# Resets the timeout timer without changing the duration (activity-based reset)
timeout.kick()

# Resets the timeout with a new duration
timeout.reset(duration=1000)

Date and Time Helper Functions

These are helper functions that are not directly part of the timer classes showcased above. Since these functions are not intended for realtime applications, they are implemented entirely in Python.

Convert Time

This helper function performs time-conversions, rounding to 3 decimal places, and works with time-scales from nanoseconds to days.

from ataraxis_time import convert_time, TimeUnits

# The conversion works for Python and NumPy scalars. Use the TimeUnits enumeration to specify input and
# output units. By default, the method returns the converted data as NumPy 64-bit floating scalars.
initial_time = 12
time_in_seconds = convert_time(time=initial_time, from_units=TimeUnits.DAY, to_units=TimeUnits.SECOND)
print(f"12 days is {time_in_seconds} seconds.")

# It is possible to provide the units directly, instead of using the TimeUnits enumeration. Also,
# it is possible to instruct the function to return Python floats.
initial_time = 5
time_in_minutes = convert_time(time=initial_time, from_units="s", to_units="m", as_float=True)
print(f"5 seconds is {time_in_minutes} minutes.")

Rate and Interval Conversion

The rate_to_interval() and interval_to_rate() functions convert between frequencies (Hz) and time intervals.

from ataraxis_time import rate_to_interval, interval_to_rate, TimeUnits

# Converts a 30 Hz frequency to a microsecond interval
interval_us = rate_to_interval(rate=30, to_units=TimeUnits.MICROSECOND)
print(f"30 Hz = {interval_us} us interval")

# Converts a 1000 us interval back to Hz
rate_hz = interval_to_rate(interval=1000, from_units=TimeUnits.MICROSECOND)
print(f"1000 us = {rate_hz} Hz")

Timedelta Interoperability

The to_timedelta() and from_timedelta() functions convert between numeric time values and Python datetime.timedelta objects.

from ataraxis_time import to_timedelta, from_timedelta, TimeUnits

# Converts 500 milliseconds to a timedelta
td = to_timedelta(time=500, from_units=TimeUnits.MILLISECOND)
print(f"500 ms as timedelta: {td}")

# Converts a timedelta back to microseconds
us_value = from_timedelta(timedelta_value=td, to_units=TimeUnits.MICROSECOND)
print(f"Timedelta as microseconds: {us_value}")

Timestamps

Timestamp methods generate and work with microsecond-precise UTC timestamps. The generated timestamp can be returned as and freely converted between three supported formats: string, bytes array, and an integer number of microseconds elapsed since the UTC epoch onset. The precision parameter controls how much detail is included in the output.

from ataraxis_time import get_timestamp, convert_timestamp, TimestampFormats, TimestampPrecisions

# Gets the current date and time as a timestamp. The timestamp is precise up to microseconds by default.
# Use TimestampFormats to specify the desired format.
dt = get_timestamp(time_separator='-', output_format=TimestampFormats.STRING)
print(f"Current timestamp: {dt}.")

# Uses the precision parameter to control the detail level of the output.
dt_day = get_timestamp(output_format=TimestampFormats.STRING, precision=TimestampPrecisions.DAY)
print(f"Day-precision timestamp: {dt_day}.")

# The function also supports giving the timestamp as a serialized array of bytes. This is helpful when it is used as
# part of a serialized communication protocol.
bytes_dt = get_timestamp(output_format=TimestampFormats.BYTES)
print(f"Byte-serialized current timestamp value: {bytes_dt}.")

# Use the convert_timestamp() function to convert the timestamp to a different format. It supports cross-converting
# all timestamp formats stored in the TimestampFormats enumeration.
integer_dt = convert_timestamp(timestamp=bytes_dt, output_format=TimestampFormats.INTEGER)
string_dt = convert_timestamp(timestamp=integer_dt, output_format=TimestampFormats.STRING)
print(
    f"The timestamp can be read as a string: {string_dt}. It can also be read as the number of microseconds elapsed "
    f"since UTC epoch onset: {integer_dt}."
)

Parse Timestamp

The parse_timestamp() function parses arbitrary datetime strings using strptime-compatible format strings and returns them as timestamps in any supported format.

from ataraxis_time import parse_timestamp, TimestampFormats

# Parses a datetime string into a microsecond integer timestamp
us_timestamp = parse_timestamp(
    date_string="2024-03-15 14:30:00",
    format_string="%Y-%m-%d %H:%M:%S",
    output_format=TimestampFormats.INTEGER,
)
print(f"Parsed timestamp: {us_timestamp}")

# Parses into a string timestamp with day precision
day_timestamp = parse_timestamp(
    date_string="March 15, 2024",
    format_string="%B %d, %Y",
    output_format=TimestampFormats.STRING,
    precision="day",
)
print(f"Day-precision parsed timestamp: {day_timestamp}")

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 the axt-benchmark CLI command.


Developers

This section provides installation, dependency, and build-system instructions for the developers that want to modify the source code of this library.

Installing the Project

Note, this installation method requires mamba version 2.3.2 or above. Currently, all Sun lab automation pipelines require that mamba is installed through the miniforge3 installer.

  1. Download this repository to the local machine using the preferred method, such as git-cloning.
  2. If the downloaded distribution is stored as a compressed archive, unpack it using the appropriate decompression tool.
  3. cd to the root directory of the prepared project distribution.
  4. Install the core Sun lab development dependencies into the base mamba environment via the mamba install tox uv tox-uv command.
  5. Use the tox -e create command to create the project-specific development environment followed by tox -e install command to install the project into that environment as a library.

Additional Dependencies

In addition to installing the project and all user dependencies, install the following dependencies:

  1. Python distributions, one for each version supported by the developed project. Currently, this library supports the three latest stable versions. It is recommended to use a tool like pyenv to install and manage the required versions.
  2. Doxygen, if you want to generate C++ code documentation.
  3. 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 for each development platform.

Development Automation

This project uses tox for development automation. The following tox environments are available:

Environment Description
lint Runs ruff formatting, ruff linting, and mypy type checking
stubs Generates py.typed marker and .pyi stub files
{py312,...}-test Runs the test suite via pytest for each supported Python
coverage Aggregates test coverage into an HTML report
docs Builds the API documentation via Sphinx
build Builds sdist and wheel distributions
upload Uploads distributions to PyPI via twine
install Builds and installs the project into its mamba environment
uninstall Uninstalls the project from its mamba environment
create Creates the project's mamba development environment
remove Removes the project's mamba development environment
provision Recreates the mamba environment from scratch
export Exports the mamba environment as .yml and spec.txt files
import Creates or updates the mamba environment from a .yml file

Run any environment using tox -e ENVIRONMENT. For example, tox -e lint.

Note, all pull requests for this project have to successfully complete the tox task before being merged. To expedite the task's runtime, use the tox --parallel command to run some tasks in parallel.

Automation Troubleshooting

Many packages used in tox automation pipelines (uv, mypy, ruff) and tox itself may experience runtime failures. In most cases, this is related to their caching behavior. If an unintelligible error is encountered with any of the automation components, deleting the corresponding cache directories (.tox, .ruff_cache, .mypy_cache, etc.) manually or via a CLI command typically resolves the issue.


Versioning

This project uses semantic versioning. See the tags on this repository for the available project releases.


Authors


License

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


Acknowledgments

  • All Sun lab members for providing the inspiration and comments during the development of this library.
  • 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 dependencies and projects listed in the pyproject.toml file.

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-6.0.0.tar.gz (59.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ataraxis_time-6.0.0-cp314-cp314-win_arm64.whl (66.0 kB view details)

Uploaded CPython 3.14Windows ARM64

ataraxis_time-6.0.0-cp314-cp314-win_amd64.whl (71.5 kB view details)

Uploaded CPython 3.14Windows x86-64

ataraxis_time-6.0.0-cp314-cp314-win32.whl (66.9 kB view details)

Uploaded CPython 3.14Windows x86

ataraxis_time-6.0.0-cp314-cp314-musllinux_1_2_x86_64.whl (536.4 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

ataraxis_time-6.0.0-cp314-cp314-musllinux_1_2_i686.whl (582.7 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ i686

ataraxis_time-6.0.0-cp314-cp314-musllinux_1_2_aarch64.whl (515.5 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

ataraxis_time-6.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (78.1 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ataraxis_time-6.0.0-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl (78.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

ataraxis_time-6.0.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (74.3 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

ataraxis_time-6.0.0-cp314-cp314-macosx_15_0_x86_64.whl (66.4 kB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

ataraxis_time-6.0.0-cp314-cp314-macosx_15_0_arm64.whl (63.0 kB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

ataraxis_time-6.0.0-cp313-cp313-win_arm64.whl (64.8 kB view details)

Uploaded CPython 3.13Windows ARM64

ataraxis_time-6.0.0-cp313-cp313-win_amd64.whl (70.2 kB view details)

Uploaded CPython 3.13Windows x86-64

ataraxis_time-6.0.0-cp313-cp313-win32.whl (65.6 kB view details)

Uploaded CPython 3.13Windows x86

ataraxis_time-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl (536.3 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

ataraxis_time-6.0.0-cp313-cp313-musllinux_1_2_i686.whl (582.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

ataraxis_time-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl (515.3 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

ataraxis_time-6.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (78.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ataraxis_time-6.0.0-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl (78.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

ataraxis_time-6.0.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (74.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

ataraxis_time-6.0.0-cp313-cp313-macosx_15_0_x86_64.whl (66.3 kB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

ataraxis_time-6.0.0-cp313-cp313-macosx_15_0_arm64.whl (63.0 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

ataraxis_time-6.0.0-cp312-cp312-win_arm64.whl (64.8 kB view details)

Uploaded CPython 3.12Windows ARM64

ataraxis_time-6.0.0-cp312-cp312-win_amd64.whl (70.3 kB view details)

Uploaded CPython 3.12Windows x86-64

ataraxis_time-6.0.0-cp312-cp312-win32.whl (65.6 kB view details)

Uploaded CPython 3.12Windows x86

ataraxis_time-6.0.0-cp312-cp312-musllinux_1_2_x86_64.whl (536.4 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

ataraxis_time-6.0.0-cp312-cp312-musllinux_1_2_i686.whl (582.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

ataraxis_time-6.0.0-cp312-cp312-musllinux_1_2_aarch64.whl (515.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

ataraxis_time-6.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (78.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ataraxis_time-6.0.0-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl (78.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

ataraxis_time-6.0.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (74.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

ataraxis_time-6.0.0-cp312-cp312-macosx_15_0_x86_64.whl (66.4 kB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

ataraxis_time-6.0.0-cp312-cp312-macosx_15_0_arm64.whl (63.1 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

File details

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

File metadata

  • Download URL: ataraxis_time-6.0.0.tar.gz
  • Upload date:
  • Size: 59.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ataraxis_time-6.0.0.tar.gz
Algorithm Hash digest
SHA256 db52a486994b0df84188db75da965859c60c310f073b4bfaad9181e3ec50104f
MD5 024e163651ff25b18b697f7a445de07e
BLAKE2b-256 2a20313efe1518622bb8b837685e50fa2302dbaffed07f2092ea0a76041009ce

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-win_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-win_arm64.whl
Algorithm Hash digest
SHA256 7b3d2673d9cbcbbf1d6ef356c62d781e61cc176e9cadde9290279bb611ec458f
MD5 9d7b519b07373e0da5bb0833a66936fc
BLAKE2b-256 617f2f7c4935bfeed8d9b843c0754c5219ce8f255d4b5bb1cfcf80a86ad38afa

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ec0a9b28a1fbda7110af6183cea61d918bacb23ca4c12ffc2a6d54f8b188b14b
MD5 1a273e7f1fedc951af6b260daa13a062
BLAKE2b-256 d266a6842b825dbae0eac79d858e7b3f99b35fbc5d6f5c5d3b9c927eb8b75f49

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-win32.whl.

File metadata

  • Download URL: ataraxis_time-6.0.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 66.9 kB
  • Tags: CPython 3.14, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 78124e5fdc99bff6e99f41d4f4ff740d7347a168800da075798115fe2f419ded
MD5 4a7fe5df67006fd9a7bc8b324d47626f
BLAKE2b-256 1149fdb6969dc045553d6302a587d709a09048f7c3147f2b09b768dde2f37e3b

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 540ded986ae800dd0afa511fc25968a3a9a6c3c5b7e32c4ba231f5780fe72467
MD5 08216e26b444ed65a75adc53e44ee4ed
BLAKE2b-256 d41d97d61120a24b8d3d6d33e93d81219c23bd2ec6aece4b4d3a19877d4023ee

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 6a4f9e67f6f4d8379bcdd7528594fcdd79c6c9aea41ddb0b11daa53a7a112f83
MD5 57afb70938dd83bd202f7fbe4248b5aa
BLAKE2b-256 0603f7ab8ee2555290059ae4390c744c44157391f0690c6b8bb3d803de4a8745

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 aa15f1c6816fe9a06e990e1c3ebb4e46b80aa272c3afe36b454b6fce5626bf4e
MD5 1d625d3d735e5e269c0b8785552249d5
BLAKE2b-256 c9bb5b5fdaff260f293d49d62bbf20dc9175c7ab4137b649586260131e1b1e1a

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a51cf2dec5f64d06899f25bf52ab12b1e6b0380a582beece37c0d49f7b939efa
MD5 37407342490c21fad7e3bc946b9e42e0
BLAKE2b-256 8c32dafeff48fd12ceb5d3e1cf14d6a8d06f49d7026cc27d5b87ce6ae29db496

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 75bcbfc2d7c91e26e95d978b015f55239b54b08a4c3b6a07170f78f3bf3b0ed0
MD5 25e9ba4fbd9518e13e7dc34428684189
BLAKE2b-256 a591e39e7823f3f144bbe3519217ac498081757f8f565d6f86604275b5a73df4

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ac6ca41ae0c46308c0e024b6e4977d00158418d606be03853a76e556a793e455
MD5 3b23cbf144949d7ee3842bd68a51202c
BLAKE2b-256 4d1294c5833d012d9e9117801d7d020ace480175bc11d83ff4d5d53f1a862bad

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 abb29f59d37c40c008bcf3e906a22ffeedf2c8acb1dc54e41afb34725c9dcd39
MD5 cc11fa587757a7c5b79742f6784fd693
BLAKE2b-256 33d174fde228163754e3922d33ae1733953c10869c6496822c4cafb5be234c2f

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 6a340c5d89795739d992885645b2d9d3a40472ae141e282c153609c2c4bdc7ff
MD5 1b007005d7a85ac418b45f6906f18316
BLAKE2b-256 c989e7eae2da51342fad4d47480ff58cf0af8bc9e1c927f220dff959a02ef14c

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-win_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 e834026cb961739ba954ceddbcedfdd2a646c59cc9fee440361576e6b173b094
MD5 baea234d0a2083ec530df0c467d1ce50
BLAKE2b-256 35a12e50ebf24a222715eec73312d8ec06e0b14dca8b706ae661e4b608561e24

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a56b00d450e36756c48a099e49f2be3528d292f2163f34d12388133597e5217c
MD5 21e4bee5ebfe80d46acc38029949261e
BLAKE2b-256 1bf6d43c51ac9e79899c445d507025413e78fac52630271ebfb2ac520bebcd90

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: ataraxis_time-6.0.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 65.6 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 520f3ad142dc13f1b1284baab6b73721ff5bd8d94a899994210417086d7ca75f
MD5 4f688a0ce83822d4b5d985b44f467f77
BLAKE2b-256 503e9b27f65007e842646567b9658a6f457fb1a30b59e22a89c050c91ae8fe76

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 137035d575b9cca388ba16143332e0101a04dd396712c6d54b5cbb46cdb4db54
MD5 fa165e76ad27f7e6a288c235ee739cc6
BLAKE2b-256 9d4cd888aa1ba1f8c492662454d37e6152bf6a9f1a148c58e34d1f35c4be4095

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 e27f057f284bde525d652463331d27d52cab345c93d48346d78009d039827430
MD5 c6808c81cf08a2182bec6461514e21fe
BLAKE2b-256 ab77456ac0bd1d047ec94500cb581eed8dc588b2fd214d1a2a62f7ce2f22aa93

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 603472306b46535dda9a8604e040e3b10724a5d3dd3b5b9dcd9694fe27d0a727
MD5 4a1e12ac19a6f26acb6981bed56aaa6b
BLAKE2b-256 db2b61c32a5b6b2af44088bcdb1a50bb2372403c5eafff39b7e9437df921644f

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0e7485d8e4a510b357c1e551b3ed50bf3de6bc0e653c363b7c81ea5399a391e4
MD5 587925a3a3286a950c962801d43a1609
BLAKE2b-256 11d994a4a96652029316e5d1b1afb0125dff935894af55a1f7a703bc1c9f0fe2

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 13a8d57ce88ce3551c6e09340fbafa950c2d4851bc1bfc7f6073f37e10fb7481
MD5 52b2eba94733f7ac62e7b4ae87175d3d
BLAKE2b-256 da1832ece6178a9fc33f10584f23cd5620e8ef2aacc7aa92b0374ff6be36997d

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 faaa092c96adda2334d8c4c82ed0a9e54e580102cdb7374809d13bcfbb15cea8
MD5 4995c7ec2a49c6aa2864f1180b05e757
BLAKE2b-256 3caf0c1649455d0c1e0c14cb0229e40448cc75acae7f8ecb0326b629f3e44f54

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 a32f222e1575bc673d01e2568d333358f4f1d99864c502af5ffdced4da5e486f
MD5 084d9055e30452a0cbf830d6acf297fc
BLAKE2b-256 1969cd2471d189ab1e3d3f1a25dd9c6e5a921bf1361e2975be486d1a13aaafe4

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 b47671624302cca5f1bb5b52f0da5fe14155bf0b073e160d5758c516d2985361
MD5 4933e6aa09d6910971b1adc3d3ef29fe
BLAKE2b-256 8255986aa6e208dae5d6106adedf42dfbeef0c213e2b9552bbd9ba0b364bbe07

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-win_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 76a3e3ed3cdc22bc16214e073e3128a31b4ef2162fe155052f6af8dc7ec8a759
MD5 4b4462536288ed92f5213332f89ec882
BLAKE2b-256 317979fba6a1aed8e4cfe354ae82092f5fe700f9e7d943bfec11438cfc60f643

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3c952a9292384ac753a310a8445dc25fd121d9f008ba399642980bf358b849ea
MD5 bb668bc2671bef8346f57b196ac4852b
BLAKE2b-256 09ff279323197ff13a5c8dd4cbbb81135ab275af79425f13198a8de97890bd32

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: ataraxis_time-6.0.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 65.6 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 3c6015425bcee588cd33839ae19d19ee1826b89e2ace82524a61b3ec1e4504fc
MD5 40262577254b2141709cf56b00b2c8fb
BLAKE2b-256 c1531fb15f4ccf2bb61a3a9bfe59394d17ba0aa044a5867fbd6cd98a38f385b1

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0d0bc4b5eccb3f1d412d79b7dc809af1e5929978b1169d611b59c3f0c889421d
MD5 fb97989803efcb9e0f981f87ccbf8bbe
BLAKE2b-256 9216714526173220da5e73f5094bff485e507729b98c55771cc775d6f0b1e00c

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 9aa56cbf98f3c5aeb2e3e383e14233b6166dbce1ab57dda350857909cb02555a
MD5 7d551393c51965eb595c28ef9a9a3abc
BLAKE2b-256 00f81282f449946faaba079336b27f672415968e664404db6c17f09b955bb8c0

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4ef757737912c4ba2529b8e18f22921a31fb5fe44dc13f4eaf57e3c109d48ebd
MD5 cefc22e9ef6f9c13387823312424ad52
BLAKE2b-256 096ca75922cf1146775667bf5838caf7fc15ee602aa07c82f2df76500c794e9f

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7fbdacfd34516d964fc42aa3a095ca925b70a33d8d1695d8294372f028a89de2
MD5 c3d0a6ae99c352678e00400447732920
BLAKE2b-256 ff28a79531199d0ae4920f26e76ddf9aab0d1b6680779e463fbbbbcb541cc107

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 d41c43bc223c1f1aec66c613e063059e8196c514925da67ed579431c5c25188f
MD5 69a69cee16f746c2aafc9636fbbfd540
BLAKE2b-256 048c0f4d929865b4cf34782f6f7f33a4323f9d360e2f8b7efee98a29b0345da2

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 486ee509a96ce16809635322c2855771ff5667a18152cfd587cadde102051656
MD5 a1e6ce4dabba5188fa5edf3a9b415721
BLAKE2b-256 3f5313b128e858d2585c4374b359cb00855786d7de46b0639d9d586b5adb9e37

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 8400fa78d4ca94213de465cf09927def6ffa7e08eae3c8d1f7fec51f37ae7ae5
MD5 9af7bcff04306cd3946637ce2d0f2dbb
BLAKE2b-256 e94be7ba329398b42e8ad87770c905dd2db059aaaf42a1be5b5072c1961db67c

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 a7343813bee380301ae71490ee8dbdd925b444911d70499e6dac9becba0aa3a7
MD5 accc46d61f308b304e08455517f78b6e
BLAKE2b-256 9311b00bc7ae3f20eb3bf785f994774232cbdb2a33e76f02326538a33378fdb6

See more details on using hashes here.

Supported by

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