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.1.tar.gz (58.9 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.1-cp314-cp314-win_arm64.whl (66.1 kB view details)

Uploaded CPython 3.14Windows ARM64

ataraxis_time-6.0.1-cp314-cp314-win_amd64.whl (71.6 kB view details)

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14Windows x86

ataraxis_time-6.0.1-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.1-cp314-cp314-musllinux_1_2_i686.whl (582.7 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ i686

ataraxis_time-6.0.1-cp314-cp314-musllinux_1_2_aarch64.whl (515.6 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

ataraxis_time-6.0.1-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.1-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.1-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.1-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.1-cp314-cp314-macosx_15_0_arm64.whl (63.1 kB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

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

Uploaded CPython 3.13Windows ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

ataraxis_time-6.0.1-cp313-cp313-musllinux_1_2_x86_64.whl (536.4 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

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

Uploaded CPython 3.13musllinux: musl 1.2+ i686

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

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

ataraxis_time-6.0.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (78.2 kB view details)

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

ataraxis_time-6.0.1-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl (78.3 kB view details)

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

ataraxis_time-6.0.1-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.1-cp313-cp313-macosx_15_0_x86_64.whl (66.4 kB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

ataraxis_time-6.0.1-cp313-cp313-macosx_15_0_arm64.whl (63.1 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

ataraxis_time-6.0.1-cp312-cp312-win_arm64.whl (64.9 kB view details)

Uploaded CPython 3.12Windows ARM64

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

Uploaded CPython 3.12Windows x86-64

ataraxis_time-6.0.1-cp312-cp312-win32.whl (65.7 kB view details)

Uploaded CPython 3.12Windows x86

ataraxis_time-6.0.1-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.1-cp312-cp312-musllinux_1_2_i686.whl (582.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

ataraxis_time-6.0.1-cp312-cp312-musllinux_1_2_aarch64.whl (515.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

ataraxis_time-6.0.1-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.1-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl (78.3 kB view details)

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

ataraxis_time-6.0.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (74.5 kB view details)

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

ataraxis_time-6.0.1-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.1-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.1.tar.gz.

File metadata

  • Download URL: ataraxis_time-6.0.1.tar.gz
  • Upload date:
  • Size: 58.9 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.1.tar.gz
Algorithm Hash digest
SHA256 0858e999dd78105130e1f43ca1451e8a8b90f4ba7cc1695e951cd64e87fa5846
MD5 8b8bf065b9d84bf274caf2c3e1fc89fb
BLAKE2b-256 08472fdea4b861ac3a2a95917a96ae8b18d928a72b59e5805bd11dea4d369cab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-win_arm64.whl
Algorithm Hash digest
SHA256 8067602b499ec7b90a269720a9aaa7d5f2e00d901e152fa888708918f162aa33
MD5 afae8c5d6b278826b2e8888b2735845b
BLAKE2b-256 0bd5e8ea03f0d9720c5c4d838fdc0d7180eed3fa16f0857546cb2ab3ff10ceea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 1bd705405dcce9658a03acb45a1380bb0cf983eb6ee90f5cf9dd529713677cb3
MD5 34e2c7dedd5560b8bc615be7299c8210
BLAKE2b-256 dc3134e90a484590ed0e10bf046e875eaaaccc1884110ad231c0d5e6b2792a27

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ataraxis_time-6.0.1-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.1-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 23d6e9a99c1a02962d92cd540792adf1376d8d30f404a9c82b0011fabc122564
MD5 1910e5d18838003dbf7545a56361343e
BLAKE2b-256 3245bbc0c71696eb1476d8e93c2197798e390b6756c4543571579d9ac64e3ac0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6b47c95f91edb6f734af1ed0e047e39d6ed6e59b10ed35c0a0dbda062ba48f49
MD5 a4e70d6ec4ddd19bbf5e627e2db24a77
BLAKE2b-256 3b65cd08f6e2d5c381af156b27faf9b29905b4b023b2e2cfb7da1fbc418a27fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 c1da9beaf07f944bcaaeb74098903e408789c9f700303c4a4d190f66d1e47301
MD5 6980476e5a2df5e5f18bdb6e1e997608
BLAKE2b-256 961a2b5bf0c1e9131930d23cb91a69c561ece9e413721cf7164d9af2de759ca5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9912a14ea76deaec688b422a3dec1a6e383f94b9b37b647106d507ec34db0244
MD5 1cee847226d62931992f5600a9cab2f1
BLAKE2b-256 21544e35168e4ccdccc2142bed9ee53496a3740e740e0b68b993e74a9949c645

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4ae399d7acc1a03c0ad9ed05f183ecb4beed22e94dcce6fc0f694e0f31956863
MD5 0820fbd6068d0143c6f8033fd128a054
BLAKE2b-256 715495c5e006f775e203d1409a7467078750c42c83dcdfb41869cdc641b24a50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 9ea81bd2c49c9cb88d8b3703f05d092f829e120a34337e5e0faada9912d71a76
MD5 2d151613556748cd037e022ba7d35ac7
BLAKE2b-256 01e9571e3cc637d1d3476adfabb6c0876ca749f2dbf1fb6e0725ff92d914c9f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 495a2f44eb9eae396e24eecf3491aeeb19a528af584e4026ec5cb7f15c6c065f
MD5 a62b5bb216ec8b877f14ceb65adfc006
BLAKE2b-256 c5c9cbe7b7881d2044ce3e1e4c92fa05a5b4072145106cad949d1ab439b8b810

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 b11955adfa07c35e5fc81dc348cd79c6c07217f3678e01abc2f5cc602cddb304
MD5 f903ba325f32b7d47e09efc1bd69908a
BLAKE2b-256 18461be38def6786a851d163e721c4119e6ab3b0504ef52b9ca13b53eba31bc8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 62b8e9257b6bac7e7e60dd49da9c33c2e3b2cf5bc689e4956a14c4a7f24b1cb2
MD5 a842bb3543c4df999c8a7b6189ae345f
BLAKE2b-256 a14f008e13317eafb3903dd2dc512734e455fb240afbf6f17628f467ee24a953

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 1a2987f084ae2c4a4d72e60834451bb128b5607630abff260f092a03fb36da3c
MD5 e96e5c1526ad97e83ea004658af14c0e
BLAKE2b-256 9605fb0821f6751d218d9c4fc3f61801be4ec2c38202958ddaf4be2ea8bc0f29

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 0c3dd05fcc6c5f06825657f0f37335fc3da02db864cdc5d3f0d2f22c77d78305
MD5 f444d243ff8622165a01690a5d588d7e
BLAKE2b-256 4b167ebd38994e75af178a1d67cada5b1ce9576103284273536dd0c9217e9f5f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ataraxis_time-6.0.1-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.1-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 4a9b4fb7461f35fb24f5ad5bd39c2079709614c93477d57fa9dcb0ff6b10cbd0
MD5 ebc683851412d0508a6b78b5697435d9
BLAKE2b-256 dcebe7b702a129c518e0e6905c2a6b779f3848bff77d4fc81a6f45d384a48f37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c9722f1062f2ad10d51eacd65205bee4d1e35af3b3643588d0f4f9e55a4068a1
MD5 24219bdc14fa3dde805f06abdbbd6bfa
BLAKE2b-256 0d99591a94620f9b548c20166f6fb0d91ee72b4426f867e34d3ccf601c44ca52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 5c6ed90e6b0caf5ea02967e730af9d7119c37671f1addc2fa3af69c93b1e9774
MD5 8dd8cf745b7e1f21429bee2afae612f1
BLAKE2b-256 6cef7c28237c31a74eea9fd9b0e724a8ebcbe32ab95132b4cc4e15271aa28627

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 35365516a3b2ea574d49bacd37aad648bacb82d4681403045d5b24329f4e08e6
MD5 bc0234c3ae534f98c0f0d9c5e5a34448
BLAKE2b-256 fee36f7aa78e060ac144bed3e49aff808b6a72e61d444809a70c712bc880d2c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 55b5b148b79870500c09978ca0d79685fd539109615caef9d0dea4626b5fae81
MD5 8a822c926252d15c11b6b13461427f9b
BLAKE2b-256 1e77b20d5d3f0ee41ec696cf7d18c0776a218e6b590293bad20f372c79bcc31a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 30ca1e0e5df77c373cf908138d5a359bf3c566fff05e24eb4a9a42e47dcbd595
MD5 675d451478a6dceb9c3c4d2c59bca53e
BLAKE2b-256 a79c93147a29da37ea2fe95e083abaf7f8fd4542624623d93e643df5dd2695ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fb5ef7949b588e52bc4c62c02750847c49bd42fbc702016fbf9f5b46298926e6
MD5 1feee8b2c7396abde5802cb4f0af8c83
BLAKE2b-256 32b56655b4714d4eb00f0374509be712c67df2c9fd9831b6ee4c1f1f1cdd909d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 b152abe77aed2a68ecd903450d252fb7c094e6dc56aafa5643352c8af7160d40
MD5 a98cafe91c593773bcd479768f24d6aa
BLAKE2b-256 64d7c8d7b80e4c9a69be8fddf4a95c9c0e63bfe4a15d75304daa541f34b67f5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 8f800a8a96c68b7626cd4c2631d619bba5536d3eeed6b48e00a36189843f3d3d
MD5 3c191843ec0ae822402b9a42e8848b10
BLAKE2b-256 43dd1d27dc30ff14b1d875cc9ed57ee9e467d32c7660e8399d03ee2c06286d0d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 2e609378d2e95e283db0446210c77ac4150801f8684fcc4b31d188e30c04f5de
MD5 1ac31ced35e4465998f6e74a393d6aa3
BLAKE2b-256 311da78960097d2b1937d9480b7a362e591ed4801caf8434e766974e4e134a62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8178be73cafe473695ff138665f28ae9636fd1aa05db0e4b7fc150ca4b572393
MD5 4e8741a17938800e18c96ffcc8515bf2
BLAKE2b-256 582db10ab83b46ae9a375c988adc77562f894babb3053e1d38d02a411da71c3e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ataraxis_time-6.0.1-cp312-cp312-win32.whl
  • Upload date:
  • Size: 65.7 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.1-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 78f4962742d83dfa4eddc2b65f8bf3b156e29b03e8b7129c08d8359a66019513
MD5 3a2ee938cb0f19e257051d7a549e7b35
BLAKE2b-256 1f54a73751ff2f4adf84c1842c12cf4afa4af34b13141b7fed106261fba520be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1a9cc87784b3b96b6509cc5a6d053c020c756a64d4290f2f07136f2692fcc78d
MD5 3a5c7ec75424e2b763d09bc8b20708a7
BLAKE2b-256 707fc05bf2142415df2fa83f1dbe4c178ba2a1bf3d6e86947971bc750f2fcff5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 852d5081da2880d4affa13bd9eb57e7b76035cecb0ddb1675ee7187aa4ddda73
MD5 6c6ee829978e09b2896717850377175d
BLAKE2b-256 6f63cdb058e77806bc650957bdf0e18eeccc3062ea85b522c034aa10ce6fba95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7721ba9b0bc4c41676741082f4195d987783a10b2076820c8fb6157445c90f02
MD5 2172d983749c1126fd65c2e081535789
BLAKE2b-256 46b7cc34007569c91986cdf1834e0027ca199dbe15d3289955c45aa3406357cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e063347c31d80cdb922397779ca595b3feaa153ff075284371f54389a9264bbe
MD5 05e08cfde9d7ba8f7cfaac98050cc621
BLAKE2b-256 a3678356a1ea5d1f50dc303d9c7b13740dea3fa92e63341bd2e5b4a7f8050442

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 a73babf0f5d16d25a3ca85767aee82be76f268d75277df8e06cff3d43706f3e7
MD5 2db512df8842893217719f6a086a76e3
BLAKE2b-256 0a91e9aa5c387c3a405924ff35262d24433d08e90754c8fe33c4d0b5d736bae8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8cb8195ce769b26d66b278e72cc3310a5c032120189f24c23663685454b32b0f
MD5 2f7199309865d1b7db4be1d1bd971843
BLAKE2b-256 d97a94609214759cbaea722be686691cb76ac57e2b36a42cbf4fcefea6035ce9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 272223818bca3044768a29e02e6c5da88272ecea9cd1619b9a665b50945182d3
MD5 59d5c741fae6d69f9a8a2abee74d2284
BLAKE2b-256 40f1e930717fefe892ed4b0d6c97e9fdcb7abd5b1b8e9b3ed9cf66e823d0aad3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ataraxis_time-6.0.1-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 458061ea13b20aa43cf30540cc32716c2018ff0bedc5d09dfc39bfb4d68c25b7
MD5 88b18f5ca6944fd8bfb4c85106482848
BLAKE2b-256 3b5e4b1787231bb2f27ab924fd7405d81c85d9f0f229f10f64e356f89f3a247b

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