Skip to main content

Smith-Waterman and Needleman-Wunsch alignments with a nanobind C++23 backend.

Project description

stride-align

Languages: English · 简体中文 · 繁體中文 · 日本語 · Deutsch · 한국어 · Français · Español · Português do Brasil · Русский · Tiếng Việt · Bahasa Indonesia · हिन्दी · العربية · Türkçe · Polski

stride-align is a blazing fast library to tell you how "similar" two strings are. It does this by implementing the Smith-Waterman and Needleman-Wunsch algorithms. Instead of giving you a lecture, we're going to learn by doing. Let's dive right into how it works.

Installation

pip install stride-align

On Loongson systems, install NumPy from your Linux distribution before installing stride-align:

sudo apt install python3-numpy
pip install stride-align

First, just a disclaimer: I'm not using religious texts here to push an agenda - for this demo I need multiple largish public domain documents that have the same meaning but are phrased differently. The Bible just happens to fit that demo requirement freakishly well.

Imagine we have two sentences - let's use the first sentence in Genesis for this:

In the American Standard Version we have: "In the beginning God created the heavens and the earth."

In the King James Version we have: "In the beginning God created the heaven and the earth."

We can see with our eyes there's a difference - heavens vs heaven. But how do we quantify this difference? We'd use this little bit of code:

import stride_align as sa

print(sa.smith_waterman_normalized_score(
      "In the beginning God created the heavens and the earth.",
      "In the beginning God created the heaven and the earth."))

When we run this it prints:

0.9907407407407407

Normalized scores are between 0 and 1. A score of 1 means the inputs are an exact match under the default scoring model. Scores near 0 mean the inputs have little in common, though Smith-Waterman may still find small local matches inside otherwise unrelated strings.

Now let's change the text and see what happens to the score.

import stride_align as sa

print(sa.smith_waterman_normalized_score(
      "In the beginning God created the heavens and the earth.",
      "The quick brown fox jumped over the lazy dog."))

and Python prints

0.12222222222222222

Starting to get the idea? The more similar the strings, the higher the score.

Let's build a bigger example, something that gives us a feel for the library's performance. You'll probably notice that we switch between Smith-Waterman and Needleman-Wunsch and may be wondering which to use when. Use Needleman-Wunsch when you want to compare the whole input against the whole input. Use Smith-Waterman when you want to find the best matching region inside larger inputs.

Okay, let's move on to the demo code. You need requests for this part of the demo:

pip install requests
import os, time, requests
import stride_align as sa

if not os.path.exists("kjv.txt"):
    response = requests.get("https://openbible.com/textfiles/kjv.txt")
    response.raise_for_status()
    response.encoding = "utf-8-sig"
    open("kjv.txt", "w", encoding="utf-8").write(response.text)

lines = [line.strip().lower() for line in open("kjv.txt")][2:]

while True:
    if not (query := input("Enter a snippet to match.  Press enter to end.\n")):
        break
    t = time.perf_counter()
    scores = sa.needleman_wunsch_normalized_scores(query.lower(), lines)
    best = int(scores.argmax())
    print()
    print("Score:", float(scores[best]))
    print(lines[best])
    print("Search time: %0.2fms" % ((time.perf_counter() - t) * 1000))
    print()
    print()

Now how can we use this? Suppose we have a random Bible verse and want to know what chapter and verse it comes from. grep you say? Oh, heavens, no, we made a mistake. The verse we have is from a different translation, say the Catholic Public Domain, and what we have on our computer is the King James Bible. grep's exact string matching won't work here. How do we find the chapter and verse? We search for the "closest" or "most similar" string using stride-align, of course.

In our demo the first part concerns itself with downloading and caching. The good folks at Open Bible put this text where it's HTTP-reachable, but we want to be respectful of their IT budget so we cache what we download. It's just good citizenship.

In the next part we load all of the lines into a list. We remove newlines and make everything lower case because we don't want to get all fiddly about whether we're holding the shift key.

Lastly that while True: loop collects a line of text, presumably the Bible verse from the Catholic version of the Bible we want to look up the chapter and verse for, and matches it against all of the lines in the King James Bible using the batch form of Needleman-Wunsch. It returns an array of scores. We use argmax() to find the best-scoring line and then print the line associated with that index. Let's try it.

I'm going to use Jeremiah 4:28 from the Catholic Bible - it's actually quite different from the same verse in the King James Bible. Let's see what happens ...

$ python3 demo2.py
Enter a snippet to match.  Press enter to end.
The earth will mourn, and the heavens will lament from above. For I have spoken, I have decided, and I have not regretted. Neither will I be turned away from it.

Score: 0.3598901098901099
jeremiah 4:28	for this shall the earth mourn, and the heavens above be black: because i have spoken [it], i have purposed [it], and will not repent, neither will i turn back from it.
Search time: 206.51ms

... and we found it! And pretty quickly too.

Now let's do another demo: spell checking.

This is a toy spell checker, not a production one. It ignores punctuation, capitalization, word frequency, proper nouns, and context. The point is to show the same one-query-against-many-candidates pattern on a familiar task.

import os, sys
import stride_align as sa

paths = ['/usr/share/dict/words',
         '/usr/dict/words',
         '/var/lib/dict/words',
         '/etc/dictionaries-common/words']

for path in paths:
    if os.path.exists(path):
        break
else:
    print("Sorry, I can't find your dictionary", file=sys.stderr)
    exit(1)


words = [line.strip().lower() for line in open(path)]


for line in sys.stdin:
    new_line = []
    for word in line.split():
        scores = sa.needleman_wunsch_normalized_scores(word.lower(), words)
        word = words[int(scores.argmax())]
        new_line.append(word)
    print(' '.join(new_line), flush=True)

The first thing this script does is try to find our operating system's list of correctly spelled words. Its location can vary from distribution to distribution. Once we've found it, we load it, strip off newlines and start the act of spell checking.

The spell checking looks a lot like the matching we did before. For each candidate word, we match it against all of the words in our list of correctly spelled words, use argmax() to find the highest-scoring candidate, and replace the word with that candidate. We could speed things up with some optimizations, like not searching for a match for correctly spelled words, but this is a demo and that optimization is left as an exercise for the reader.

Let's see how it works!

$ cat - | python3 demo3.py
this is a demonstrtion of a spel checker
it doesn't matter that I can't spell corectly

this is a demonstration of a spell checker
it doesn't matter that i can't spell correctly

Details

The current scaffold provides:

  • Needleman-Wunsch score-only alignment
  • Needleman-Wunsch alignment with traceback
  • Smith-Waterman score-only alignment
  • Smith-Waterman alignment with traceback
  • A backend layout that matches the specialization pattern used in massive-speedup
  • CPU/backend detection and Python-side backend dispatch

The native boundary accepts:

  • bytes against bytes
  • str against str
  • sequences of immutable hashable Python objects
  • mixed sequence/object inputs where a str or bytes side is treated as a sequence

Direct bytes versus str pairs raise TypeError.

The current implementations are generic dynamic-programming kernels with preprocessing that serializes Python inputs into 8, 16, 32, or 64-bit token streams. SIMD-specialized backends can replace the backend translation units later without changing the Python API.

Score-only functions return numeric scores. The normalized variants return scores between 0 and 1. Path functions return alignment result objects containing the score, aligned values, operations, and CIGAR-style summaries where available.

API

import stride_align

score = stride_align.needleman_wunsch_score("ACGT", "ACCT")
scores = stride_align.Scores("ACGT", variant="needleman_wunsch").compare(["ACCT", "AGGT"])
result = stride_align.smith_waterman_path("ACCGT", "CCG")
wide_result = stride_align.smith_waterman_path("ACCGT", "CCG", width=64)
object_result = stride_align.needleman_wunsch_path(
    [frozenset({1}), frozenset({2})],
    [frozenset({1}), frozenset({3})],
)

print(score)
print(scores)
print(result.score, result.aligned_query, result.aligned_target, result.operations)
print(wide_result.score)
print(object_result.aligned_query, object_result.aligned_target)

Use Scores(...).compare([...]) or the *_scores() functions for one-query against many-target score workloads. That path prepares the query/profile once and is the preferred performance API for repeated English/Chinese text comparisons.

Traceback outputs preserve the paired fast-path type:

  • str inputs return aligned str
  • bytes inputs return aligned bytes
  • sequence/object inputs return aligned tuple values with None gaps

Pass width=8, 16, 32, or 64 to force the internal token/scoring width instead of using automatic selection.

Some functions expose CIGAR strings, short for "Concise Idiosyncratic Gapped Alignment Report". CIGAR is the compact alignment-operation notation used by SAM/BAM tooling. If you want the full formal version, see the SAM specification.

Optimizations and Benchmarks

Careful attention has been, and continues to be, paid to stride-align's performance story. The library includes SIMD optimization for a variety of common targets, including x86, Arm, and LoongArch.

LoongArch / Loongson. The Loongson optimization story is especially telling: for the checked benchmark case -- English text, 16-bit score width, score-only Smith-Waterman -- the LASX backend is 16x faster than the generic backend and 22.4x faster than Parasail.

If you are a researcher using Loongson servers and benefiting from this speedup, citations, bug reports, benchmark cases, and tiny inexpensive Chinese souvenirs are appreciated. Tea, calligraphy bookmarks, paper-cut ornaments, Chinese knot charms, panda keychains, and small dragon desk objects are all welcome. Please do not send anything expensive or anything that requires customs paperwork.

See complete benchmarks.

Native Microbench

For perf profiling without Python frames or benchmark orchestration, configure a native x86 microbench build:

nanobind_dir="$(.venv/bin/python -m nanobind --cmake_dir)"
cmake -S . -B build/perf \
  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
  -DSTRIDE_ALIGN_BUILD_MICROBENCH=ON \
  -DSTRIDE_ALIGN_PERF_SYMBOLS=ON \
  -DPython_EXECUTABLE=.venv/bin/python \
  -Dnanobind_DIR="$nanobind_dir"
cmake --build build/perf --target stride_align_x86_microbench
build/perf/stride_align_x86_microbench --backend avx2 --shape 1:many --pass english --width 16
python tools/x86_microbench_regression.py \
  --binary build/perf/stride_align_x86_microbench \
  --cpu 2 \
  --backends avx2,avx512bwvl \
  --shapes 1:1,1:many \
  --passes english,chinese \
  --widths 16,32 \
  --write-json /tmp/stride-align-x86-microbench.json
.venv/bin/python tools/pinned_benchmark_sweep.py \
  --output-dir /tmp/stride-align-pinned \
  --cpu 2 \
  --iterations 15 \
  --warmups 3

STRIDE_ALIGN_PERF_SYMBOLS=ON keeps nanobind modules unstripped and adds debug symbols plus frame pointers while preserving -O3.

The checked-in native microbench baseline lives at benchmarks/x86_microbench_baseline.json. Treat it as a local guardrail with a loose threshold, not as a cross-machine SLA.

Citations

If you use my software in your research, please cite me.

@software{deprince_stride_align,
  author       = {DePrince, Adam},
  title        = {stride-align: Fast Smith-Waterman and Needleman-Wunsch alignment for Python},
  year         = {2026},
  publisher    = {GitHub},
  url          = {https://github.com/adamdeprince/stride-align},
  note         = {Python/C++ library for sequence and string alignment}
}

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

stride_align-0.1.0.tar.gz (6.2 MB view details)

Uploaded Source

Built Distributions

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

stride_align-0.1.0-cp314-cp314-manylinux_2_39_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.39+ ARM64

stride_align-0.1.0-cp314-cp314-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ ppc64le

stride_align-0.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

stride_align-0.1.0-cp314-cp314-macosx_15_0_arm64.whl (675.4 kB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

stride_align-0.1.0-cp313-cp313-manylinux_2_39_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ ARM64

stride_align-0.1.0-cp313-cp313-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ppc64le

stride_align-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

stride_align-0.1.0-cp313-cp313-macosx_15_0_arm64.whl (675.3 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

stride_align-0.1.0-cp312-cp312-manylinux_2_39_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ ARM64

stride_align-0.1.0-cp312-cp312-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ppc64le

stride_align-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

stride_align-0.1.0-cp312-cp312-macosx_15_0_arm64.whl (674.3 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

stride_align-0.1.0-cp311-cp311-manylinux_2_39_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ ARM64

stride_align-0.1.0-cp311-cp311-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ppc64le

stride_align-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

stride_align-0.1.0-cp311-cp311-macosx_15_0_arm64.whl (675.6 kB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

stride_align-0.1.0-cp310-cp310-manylinux_2_39_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ ARM64

stride_align-0.1.0-cp310-cp310-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ppc64le

stride_align-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

stride_align-0.1.0-cp310-cp310-macosx_15_0_arm64.whl (677.2 kB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file stride_align-0.1.0.tar.gz.

File metadata

  • Download URL: stride_align-0.1.0.tar.gz
  • Upload date:
  • Size: 6.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for stride_align-0.1.0.tar.gz
Algorithm Hash digest
SHA256 134b7d79a8d645c33f8f49abe2bf1ef1dc42fad377f875534e7bdf03abedb9b5
MD5 e4e02e2bcefeb263e94b29a471e3622b
BLAKE2b-256 6f4f864ce074ee587ae5895410b6bd3c96d002869ef4128133418952263e2bfe

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp314-cp314-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp314-cp314-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 be60f06f1e30708468a02c7478ae4262f2c45ba44b4b11b6ef535600a17f1f9e
MD5 b842f62dfc1c739e21d569d2716cb12a
BLAKE2b-256 b5028da04d19c354f4bfda275b928a6d5089f9063a584a7317553e51f12becf6

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp314-cp314-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp314-cp314-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 102d2e63cff8e70d9d75541c159796c2a620ee7bd7a3e1b5f4b4af5eb5d6dd30
MD5 e66796d74e3bc74f409e22f15a6e3791
BLAKE2b-256 9d704b501758ed8c5ae4e9a5d35b5a678ebd3942a5094220d27a5f4e34f49b38

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8edccfdb1f49d85b852f0da6d66eadcd2afa5a49845540013eee11b2e1842916
MD5 f1d261f1d8104bfb0028e3053921ca6d
BLAKE2b-256 77b4d62631f40c173ad87109764400abe3b5d6428f517997587e96d2d21de827

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 0b916f8fbc30179eafcf0a04c795b30919f9692aa05161fe51d349c3601c4ca1
MD5 1e977339e5c648dd05977612d00643e6
BLAKE2b-256 525b5f058864a95197823493ec1428195a0ae7e68b138a8bff1ecf513f74e1bb

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp313-cp313-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp313-cp313-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 3a2a27e422c777c04421036d2fdaf0236c619041e2cff892265b0135f45eccb7
MD5 d01cc6dfd57ea982eb8a184f54e88a01
BLAKE2b-256 6e1c66be82d9e2a2609c90e505d905b34f599e667785c4dc204c8d02a9cbe228

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp313-cp313-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp313-cp313-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 928d265722d004366ecabca7462ac199e4f54ef82499e3c2c676cf679fa99eff
MD5 6157061a711dd45d1f235e4bf68c9f2d
BLAKE2b-256 ce0e4c04257f4174f95bbc3256b1375d6371fe6ab45de166450ff1462fbfa0a8

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0a9db8fdf7915c5e8b627e0a0f780671d8ae029c4de2b3d0ec77761090f0eaa5
MD5 3391cf7611463d638191ea58e20da320
BLAKE2b-256 17fed2871cd77cc9044cbae370e5fab642003897c48e146473ae724a79568c97

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c5be35a891e01bc0b1333094cefb33e78c21790ee2eed29ad52d0751a0e7a44b
MD5 74c03b12f5acd9eb1c539d61a2558cfa
BLAKE2b-256 bcce04be7f225c2567f0cfc895895a7a58a6a680eb39589d470169161437e925

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp312-cp312-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp312-cp312-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 ac621dd034cc6b88c91015a9a270e50c08636a6b0e58851f95d893c1ccfb98eb
MD5 ab750e5cb37069e3027f0cb856f1e1be
BLAKE2b-256 18eb12bb1fe94021167d6370ea2fcead12ad2c5c12fcf58e6e79ff7b069c84f8

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp312-cp312-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp312-cp312-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 0c658074b3ed19cadd26148c657616b70382bbee44ad50f933f0dafaf9350332
MD5 02507c80da1b62850766034c3e77694f
BLAKE2b-256 e160bfe597b1c02633b5a8835909acf19caae3962e91601cb7da16698b041bd8

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e7f1b185a465a7264e947cdc194ce1481b572fea1b05dc86495036b8c38cb3cc
MD5 b1e7374550d11f595ec36f238f3e5d29
BLAKE2b-256 51c91d5e52cf0e1ce7588fa54d8ff8dabfc5c7a6d810e8e11ac8531cee24c131

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 1120599e148cf65db561d4771f075c23625f9bc80cc2e68502b4f318006e8c6e
MD5 bf49d67f4f3421bd2b10face684d7ee0
BLAKE2b-256 2b9ff62516ff1df46c6f404703210199bf17b4449421c87df2f250bf72d4665c

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp311-cp311-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp311-cp311-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 f6d041bc72e11a0b55983c1eb8c38476d2d65ea1d5d2f8204d16153a79568584
MD5 1eba650ced28a19680966bdf7f218abc
BLAKE2b-256 e23f2d9f682d5f2850cb992fd7d92b8fb8c1ac11ab4a0d2964af5e377c1a66bb

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp311-cp311-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp311-cp311-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 f73c803a24075377100aeefd1f34eed51d9e8175f7803aba2c9dd6757b678c72
MD5 cc09bdc45f34c37d3fbdef61e84a58d2
BLAKE2b-256 1dc7cb38372365ebccb72c3015566b470f10802924037dc765e139c32c839565

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 efc2534a08590f02aac66084295c398babe027ba26740bc3fc873030d658e37c
MD5 db46d342a2ed15a248ddbdf309cc7edd
BLAKE2b-256 370f77388dad534c19a91de8db29aa0f0f7aa1634c343366d5d039de427191fa

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 07d6b6f1fc1fb5ffb7fccf1cb0d2cefb55c5ffa607c03c4f3726d095ea7957fd
MD5 04542afb912e003cda1c5178b24a6cc0
BLAKE2b-256 0788bc4e520d885e2e41d5ba06067c1b9a1b209dca6ac308d3078f14850c9d89

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp310-cp310-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp310-cp310-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 ed11070722ec042dfae2a2ade0eb6212bb96281bf01fb45d49b53f30af56e1ca
MD5 ee8f9a6e3c0f96749bb71f9d8d40f07f
BLAKE2b-256 ea624f4634aab3221a5ca21ff2fa5be686f274403d95b945c37878bd6b0ef072

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp310-cp310-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp310-cp310-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 7e400920e4399c5211896cb21f2cc598ded010107abc6f00376444835cd071e1
MD5 cf50359c27f7e7a8f8b4a8702b71a4f9
BLAKE2b-256 e2615b48d716e74ecdb5a8db91e371ef95d1d91d09748aac516deb0b2e0addb2

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9a2f9ba94c0afb2a456fef00aee7f75a6ee2d84a63586b543425bdf6a89f3722
MD5 afd85405d5d4f516524b731f2803917c
BLAKE2b-256 e1f576617396d9cdb08ef6b18cead3f1408e54ba0e13b9bef10c59423659586e

See more details on using hashes here.

File details

Details for the file stride_align-0.1.0-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.1.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7e919d850f53132296be0bae6923b9a05c200e9fc975ab9668dc87acdc2602c2
MD5 a0c6d62c3b856a04a04492b992d02f57
BLAKE2b-256 908b3442198ce603a3bd4be685129d64e3c905f630e70745c305d2b1635604a7

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