Skip to main content

Rust binding for python. To calculate star ratings and performance points for all osu! gamemodes, and quickly parse Beatmap into python objects.

Reason this release was yanked:

please using v1.0.4 and above

Project description

peace-performance-python

Fast, To calculate star ratings and performance points for all osu! gamemodes, And, quickly parse Beatmap into python objects.

PP Version: 21.07.27

peace-performance (Rust) binding for python based on PyO3.

Cross-platform support. Support synchronous and asynchronous(tokio and async_std).

Faster than oppai-ng, see the benchmark for details.

Install by pip

PyPI: https://pypi.org/project/peace-performance-python

pip install peace-performance-python

Reliability:

check_your_osu_songs.py

Testing on my local machine, about 70,000 maps can be calculated properly.

[ Walking (E:\osu\songs) Start... ]
[ 69146 ] .osu files founded...
[ Walking Done! ]
[ Start task ]
69146/69146; ok: 69142, err: 0; total time: 23825.90ms, avg: 0.34ms
[ All DONE ]

PP Calculate

Minimal Examples

from peace_performance_python.prelude import *

beatmap = Beatmap('path_to_osu_file') # Beatmap can be cached and reused!
beatmap = await Beatmap.create_async_rs('path_to_osu_file') # Async support!
result = Calculator(acc=98.8, miss=3).calculate(beatmap)

Full Examples

import asyncio

# import all
from peace_performance_python.prelude import *
# or
# from peace_performance_python.objects import Beatmap, Calculator

from tests import join_beatmap, HITORIGOTO, UNFORGIVING


# Initialize Rust logger (optional)
set_log_level('trace')
init_logger()


# Choose a style you like
def calculate(beatmap: Beatmap, calculator: Calculator) -> CalcResult:
    return calculator.calculate(beatmap)


def calculate_2(beatmap: Beatmap) -> CalcResult:
    # --
    c = Calculator()
    c.set_acc(98.8)
    c.set_miss(3)

    # or
    c.acc = 98.8
    c.miss = 3

    # or
    c.setattr('acc', 98.8)
    c.setattr('miss', 3)
    return calculate(beatmap, c)


def calculate_3(beatmap: Beatmap) -> CalcResult:
    c = Calculator()
    c.set_with_dict({'acc': 98.8, 'miss': 3})
    return calculate(beatmap, c)


def calculate_4(beatmap: Beatmap) -> CalcResult:
    return Calculator({'acc': 98.8, 'miss': 3}).calculate(beatmap)


def calculate_5(beatmap: Beatmap) -> CalcResult:
    return Calculator(acc=98.8, miss=3).calculate(beatmap)


async def main() -> None:
    path = join_beatmap(HITORIGOTO)
    # Load beatmap
    beatmap = Beatmap(path)
    # beatmap = Beatmap.create(path)

    # Async
    # beatmap = await Beatmap.create_async_rs(path)
    # beatmap = await Beatmap.create_async_py(path)
    # or
    # beatmap = await AsyncBeatmapRust(path)
    # beatmap = await AsyncBeatmapPython(path)
    print('\n**** Beatmap:', beatmap)

    # Calculate pp
    # result = calculate_5(beatmap)
    c = Calculator(acc=98.8, miss=3)
    print('\n***** Calculator as dict:', c.attrs_dict)
    result = c.calculate(beatmap)

    # Print results
    # print('\n***** result:', result)
    print('\n***** result.pp:', result.pp)
    print('\n***** result as dict:', result.attrs_dict)
    # print('\n***** result.raw_stars as dict:', result.raw_stars.attrs_dict)
    # print('\n***** result.raw_pp as dict:', result.raw_pp.attrs_dict)

    # Reset calculator
    c.reset()
    print('\n***** reseted Calculator as dict:', c.attrs_dict)

    # Calc again
    result2 = c.calculate(beatmap)
    print('\n***** result2 as dict:', result2.attrs_dict)

    # Load another .osu files
    path2 = join_beatmap(UNFORGIVING)
    beatmap.init(path2)
    print(beatmap)


if __name__ == '__main__':
    asyncio.run(main())

Running results

 TRACE peace_performance_python::methods::common > function=sync_read_file duration=73.3µs
 TRACE peace_performance_python::methods::pp     > function=sync_parse_beatmap duration=181.9µs

>>>>> Beatmap: <Beatmap object (
        path: ./test_beatmaps/hitorigoto.osu, 
        is_initialized: True, 
        mode: 0, 
        mode_str: std, 
        version: 14, 
        n_circles: 207, 
        n_sliders: 132, 
        n_spinners: 1, 
        ar: 9, 
        od: 8.5, 
        cs: 4, 
        hp: 6, 
        sv: 1.7, 
        tick_rate: 1, 
        stack_leniency: None
    )>

>>>>> Calculator as dict: {
    'mode': None, 
    'mods': None, 
    'n50': None, 
    'n100': None, 
    'n300': None, 
    'katu': None, 
    'acc': 98.80000305175781, 
    'passed_obj': None, 
    'combo': None, 
    'miss': 3
    }
 TRACE peace_performance_python::methods::pp         > function=calc_with_any_pp duration=55.7µs
 TRACE peace_performance_python::objects::calculator > function=calc duration=103.2µs


>>>>> result.pp: 152.19204711914062


>>>>> result as dict: {
    'mode': 0, 
    'mods': 0, 
    'pp': 152.19204711914062, 
    'stars': 5.162832260131836, 
    'raw_pp': {
        'aim': 73.0337905883789, 
        'spd': 31.048368453979492, 
        'str': None, 
        'acc': 45.17241287231445, 
        'total': 152.19204711914062}, 
    'raw_stars': {
        'stars': 5.162832260131836, 
        'max_combo': 476, 
        'ar': 9.0, 
        'n_fruits': None, 
        'n_droplets': None, 
        'n_tiny_droplets': None, 
        'od': 8.5, 
        'speed_strain': 2.0723509788513184, 
        'aim_strain': 2.7511043548583984, 
        'n_circles': 207, 
        'n_spinners': 1
        }
    }

...

Beatmap parse

Examples

from peace_performance_python.prelude import *
from tests import join_beatmap, HITORIGOTO

# Initialize Rust logger (optional)
set_log_level('trace')
init_logger()


def main():
    path = join_beatmap(HITORIGOTO)
    # Load beatmap
    b = Beatmap(path)
    print('\n>>>>> Beatmap:', b)
    print('\n>>>>> Beatmap.hit_objects (0-3):', b.hit_objects[:3])
    print('\n>>>>> Beatmap.timing_points:', b.timing_points)
    print('\n>>>>> Beatmap.difficulty_points (0-3):', b.difficulty_points[:3])
    print('\n>>>>> Beatmap.hit_objects[0].pos:', b.hit_objects[0].pos)
    print('\n>>>>> Beatmap.hit_objects[3].kind:', b.hit_objects[3].kind)
    print('\n>>>>> Beatmap.hit_objects[3].kind.curve_points:',
          b.hit_objects[3].kind.curve_points)

    pos_0 = b.hit_objects[0].pos
    pos_1 = b.hit_objects[1].pos
    print('\n>>>>> Beatmap object(0):', b.hit_objects[0])
    print('\n>>>>> Beatmap object(1):', b.hit_objects[1])
    print('\n>>>>> Beatmap object pos(0):', pos_0)
    print('\n>>>>> Beatmap object pos(1):', pos_1)
    print('\n>>>>> Beatmap object pos(0) length, squared:',
          pos_0.length, pos_0.length_squared)
    print('\n>>>>> Beatmap object pos(0 and 1) distance:', pos_0.distance(pos_1))
    print('\n>>>>> Beatmap object pos(0 and 1) add:', pos_0.add(pos_1))
    print('\n>>>>> Beatmap object pos(0 and 1) sub:', pos_0.sub(pos_1))


if __name__ == '__main__':
    main()

Running results

 TRACE peace_performance_python::methods::common > function=sync_read_file duration=78.3µs
 TRACE peace_performance_python::methods::pp     > function=sync_parse_beatmap duration=193.4µs

>>>>> Beatmap: <Beatmap object (
        path: ./test_beatmaps/hitorigoto.osu, 
        is_initialized: True, 
        mode: 0, mode_str: std, version: 14, 
        n_circles: 207, n_sliders: 132, n_spinners: 1, 
        ar: 9, od: 8.5, cs: 4, hp: 6, sv: 1.7, tick_rate: 1, 
        stack_leniency: None
    ), hidden: hit_objects, timing_points, difficulty_points>

>>>>> Beatmap.hit_objects (0-3): [
    <HitObject object (
        start_time: 536, sound: 4, end_time: 536, kind: circle, pos: (44, 136))>, 
    <HitObject object (
        start_time: 717, sound: 0, end_time: 717, kind: circle, pos: (315, 196))>, 
    <HitObject object (
        start_time: 899, sound: 0, end_time: 899, kind: slider, pos: (152, 304))>]

>>>>> Beatmap.timing_points: [<TimingPoint object (time: 536, beat_len: 363.63635)>]

>>>>> Beatmap.difficulty_points (0-3): [
    <DifficultyPoint object (time: 23808, speed_multiplier: 1)>, 
    <DifficultyPoint object (time: 35445, speed_multiplier: 0.8)>, 
    <DifficultyPoint object (time: 41263, speed_multiplier: 1)>]

>>>>> Beatmap.hit_objects[0].pos: <Pos2 object (x: 44, y: 136)>

>>>>> Beatmap.hit_objects[3].kind: <HitObjectKind object (
    kind: slider, pixel_len: Some(85.0), repeats: Some(1), 
    path_type: Some("perfect_curve"), end_time: None)>

>>>>> Beatmap.hit_objects[3].kind.curve_points: [
    <Pos2 object (x: 315, y: 196)>, 
    <Pos2 object (x: 277, y: 176)>, 
    <Pos2 object (x: 248, y: 145)>]

>>>>> Beatmap object(0): <HitObject object (
    start_time: 536, sound: 4, end_time: 536, kind: circle, pos: (44, 136))>

>>>>> Beatmap object(1): <HitObject object (
    start_time: 717, sound: 0, end_time: 717, kind: circle, pos: (315, 196))>

>>>>> Beatmap object pos(0): <Pos2 object (x: 44, y: 136)>

>>>>> Beatmap object pos(1): <Pos2 object (x: 315, y: 196)>

>>>>> Beatmap object pos(0) length, squared: 142.9405517578125 20432.0

>>>>> Beatmap object pos(0 and 1) distance: 277.5625915527344

>>>>> Beatmap object pos(0 and 1) add: <Pos2 object (x: 359, y: 332)>

>>>>> Beatmap object pos(0 and 1) sub: <Pos2 object (x: -271, y: -60)>

Building

This package is intended to be built using rust, maturin or setuptools_rust.

1. Install Rust

posix

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

windows

https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe

2. Install python dev dependencies

pip install -r requirements-dev.txt

3. Build native python lib

maturin develop --release

OR

python setup.py develop

Compile to .whl to use pip installation

maturin build --release

OR

python setup.py bdist_wheel

install .whl

# maturin build
pip install target/wheels/<name>.whl

# setup.py build
pip install dist/<name>.whl

Run tests and benchmarks

Once built, you can run the tests and benchmakrs using pytest

pytest

or bench and draw a image

pytest --benchmark-histogram

Complete bench

pytest --benchmark-disable-gc --benchmark-warmup=True --benchmark-histogram

Run examples

python examples.py

Features

Flag Description
default Enable async_tokio, all modes and choose the all_included version for osu!standard.
peace_edition Buff ScoreV2 (STD) - acc *= 1.2
relax_nerf Nerf relax and autopilot pp. Relax: aim * 0.9, spd * 0.3, acc *0.8; Autopilot: aim * 0.3, spd * 0.9, acc * 0.8
taiko Enable osu!taiko.
fruits Enable osu!ctb.
mania Enable osu!mania.
osu Enable osu!standard. Requires to also enable exactly one of the features no_leniency, no_sliders_no_leniency, or all_included.
no_leniency When calculating difficulty attributes in osu!standard, ignore stack leniency but consider sliders. Solid middleground between performance and precision, hence the default version.
no_sliders_no_leniency When calculating difficulty attributes in osu!standard, ignore stack leniency and sliders. Best performance but slightly less precision than no_leniency.
all_included When calculating difficulty attributes in osu!standard, consider both stack leniency and sliders. Best precision but significantly worse performance than no_leniency.
async_tokio Beatmap parsing will be async through tokio
async_std Beatmap parsing will be async through async-std

Vs Oppai-ng

peace-performance Python bindings vs C89 oppai-ng Python bindings.

Rust is Faster. The longer the map, the more obvious the advantages of rust.

peace-performance enables the no_sliders_no_leniency feature to be consistent with oppai's algorithm (faster, but loses precision).

If you need maximum precision (osu-performance) rather than performance, use all_included features.

This test was run on my subsystem and had performance issues with a minimum time greater than 1ms. (The minimum time in windows is 86us (padoru) and the next smallest is 192us (hitorigoto)

------------------------------------------------------------------------ benchmark 'bench-oppai-vs-rust': 12 tests -------------------------------------------------------------------------
Name (time in ms)               Min                Max               Mean            StdDev             Median               IQR            Outliers       OPS            Rounds  Iterations
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_rust_padoru             1.3805 (1.0)       1.7463 (1.0)       1.4447 (1.0)      0.0518 (1.0)       1.4301 (1.0)      0.0444 (1.01)        68;32  692.1759 (1.0)         358           1
test_rust_hitorigoto         1.6154 (1.17)      2.0133 (1.15)      1.7433 (1.21)     0.0587 (1.13)      1.7407 (1.22)     0.0439 (1.0)        129;82  573.6085 (0.83)        498           1
test_oppai_padoru            1.8734 (1.36)      2.3294 (1.33)      1.9799 (1.37)     0.0845 (1.63)      1.9659 (1.37)     0.0931 (2.12)        47;11  505.0744 (0.73)        204           1
test_oppai_hitorigoto        2.5925 (1.88)      3.1272 (1.79)      2.7537 (1.91)     0.0883 (1.70)      2.7357 (1.91)     0.0887 (2.02)        84;21  363.1464 (0.52)        346           1
test_rust_freedom_dive       3.0829 (2.23)      3.6729 (2.10)      3.1865 (2.21)     0.0687 (1.33)      3.1715 (2.22)     0.0685 (1.56)        70;18  313.8282 (0.45)        303           1
test_rust_sotarks            3.6848 (2.67)      4.0976 (2.35)      3.7886 (2.62)     0.0748 (1.45)      3.7676 (2.63)     0.0748 (1.70)        51;17  263.9489 (0.38)        240           1
test_rust_galaxy_burst       5.1418 (3.72)      5.7422 (3.29)      5.2629 (3.64)     0.0851 (1.64)      5.2349 (3.66)     0.0911 (2.08)         44;9  190.0092 (0.27)        184           1
test_oppai_freedom_dive      5.8532 (4.24)      6.3883 (3.66)      6.0279 (4.17)     0.1154 (2.23)      5.9971 (4.19)     0.1660 (3.78)         45;2  165.8948 (0.24)        161           1
test_oppai_sotarks           6.2822 (4.55)      7.0327 (4.03)      6.4706 (4.48)     0.1350 (2.61)      6.4400 (4.50)     0.1544 (3.52)         36;4  154.5453 (0.22)        145           1
test_oppai_galaxy_burst      8.2669 (5.99)      9.4358 (5.40)      8.5453 (5.91)     0.1838 (3.55)      8.5012 (5.94)     0.1732 (3.95)         25;8  117.0232 (0.17)        114           1
test_rust_unforgiving       10.9350 (7.92)     11.6170 (6.65)     11.1305 (7.70)     0.1289 (2.49)     11.1028 (7.76)     0.1701 (3.87)         26;2   89.8429 (0.13)         88           1
test_oppai_unforgiving      22.8311 (16.54)    23.7671 (13.61)    23.1481 (16.02)    0.2352 (4.54)     23.0818 (16.14)    0.2999 (6.83)         10;1   43.2001 (0.06)         43           1
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Simple Benchmarks

Native vs Wrapped beatmap object, Sync vs Async, Py async vs Rust async

Note: Rust has its own event loop (independent of python) and has performance issues due to rust's need to convert built-in futures to python coroutine. So rust async is the worst performer.

Read and parsing time spent on beatmap of different sizes (forgiving is a beatmap over 50 minutes long and takes the longest)

There are also subtle differences in the different calling methods


MIT

pure-peace

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

peace-performance-python-1.0.1.tar.gz (26.4 kB view details)

Uploaded Source

Built Distributions

peace_performance_python-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

peace_performance_python-1.0.1-cp39-cp39-win_amd64.whl (770.8 kB view details)

Uploaded CPython 3.9 Windows x86-64

peace_performance_python-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

peace_performance_python-1.0.1-cp39-cp39-macosx_10_15_x86_64.whl (918.6 kB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

peace_performance_python-1.0.1-cp38-cp38-win_amd64.whl (770.3 kB view details)

Uploaded CPython 3.8 Windows x86-64

peace_performance_python-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

peace_performance_python-1.0.1-cp38-cp38-macosx_10_15_x86_64.whl (918.3 kB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

peace_performance_python-1.0.1-cp37-cp37m-win_amd64.whl (770.3 kB view details)

Uploaded CPython 3.7m Windows x86-64

peace_performance_python-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

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

peace_performance_python-1.0.1-cp37-cp37m-macosx_10_15_x86_64.whl (918.3 kB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

peace_performance_python-1.0.1-cp36-cp36m-win_amd64.whl (770.3 kB view details)

Uploaded CPython 3.6m Windows x86-64

peace_performance_python-1.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

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

peace_performance_python-1.0.1-cp36-cp36m-macosx_10_15_x86_64.whl (918.4 kB view details)

Uploaded CPython 3.6m macOS 10.15+ x86-64

File details

Details for the file peace-performance-python-1.0.1.tar.gz.

File metadata

  • Download URL: peace-performance-python-1.0.1.tar.gz
  • Upload date:
  • Size: 26.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for peace-performance-python-1.0.1.tar.gz
Algorithm Hash digest
SHA256 48898b7b04f4defac6e720d7b9be5fec5bf5fd3e3bb3bfb93268f055971bdc9f
MD5 6e4f4075119e91188ccd5edffb1c4ee2
BLAKE2b-256 89bf0b5fda9ea2bfe2c41d2e6361f8ec36de2f3c6bdd5a961dae5d5d7be5385c

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for peace_performance_python-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dcbfd21cefa98b7f5eda9f752bd42bff1c77c391be33b6708553afd748290e08
MD5 87017ac947658084a827eeb986dd1207
BLAKE2b-256 7d1864d1a880df57bd43476375fe2bbfffe94bb3ef774c17563b91b3b3354310

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: peace_performance_python-1.0.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 770.8 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for peace_performance_python-1.0.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 0a2d9960486a11c82e0e80eb19ac5bf59c2e9ae62e234977730703f252cab40f
MD5 139e9ef7b74b5b055a077588a05017e9
BLAKE2b-256 403ab45ff6f122bde0f71ee122f3295a8e0e196eaf961fff30446493d3a681d1

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for peace_performance_python-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 34fb73d9fdbcb6b09fe184e116de78c71df5e7beede76a645c1243e017fd323a
MD5 a19212a807ed7b2db57ca999d36a9993
BLAKE2b-256 27d3f403d45e13d1e476ef8d2f7b49da0f845e33bcba10b11485b5479f961986

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: peace_performance_python-1.0.1-cp39-cp39-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 918.6 kB
  • Tags: CPython 3.9, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for peace_performance_python-1.0.1-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 a46dfef48e3922dff9190f68c7d1e1dfb88048350746405be3a6633241da6eae
MD5 05982b165ff557f64cb45ef33b94da27
BLAKE2b-256 54cbacc571bc2ad5332d85f49e39c5becf63f8adb40814cf61962e266d4b6fd8

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: peace_performance_python-1.0.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 770.3 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for peace_performance_python-1.0.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 d179f9351a97d7740d9c0c3a84a5490dd0f2705c2bb946aad74884b78564d715
MD5 1d7b4ee5cb0e56e11b4ae6e79b40944d
BLAKE2b-256 e14a823de214b54edfdc8dfb524bb5bcc487100dd519c74af8b3c351f6a65b50

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for peace_performance_python-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1370ccb3cfbf9099cc7a846fd4dc7ec11c18aeaa6329d0cdb41b1735f9b11a4c
MD5 2f52a199473a4901dd724a40da5cf494
BLAKE2b-256 bc78470636f4dd72eb6cbb70cd4491888f16daff4dfdcd4d886467c314b48a45

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: peace_performance_python-1.0.1-cp38-cp38-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 918.3 kB
  • Tags: CPython 3.8, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for peace_performance_python-1.0.1-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5a9513f6e28b52c79d9cff3fd2914833d747c32a7e92e67eb8aa2dedd1f32e57
MD5 efe5d68f60b1792700d9bffd4937e137
BLAKE2b-256 61629b4fbce9d930cbd7d4f9ca51560bc7a5025b3b3644c3b2bfc6abce13cf82

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: peace_performance_python-1.0.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 770.3 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for peace_performance_python-1.0.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 8383340601f816ca554a4d1f737e8bb7b4d6a1f7525c27c7f505469cbe02c6f4
MD5 f5a16c77ddaf83c61825055d65a10dcd
BLAKE2b-256 4a53a1e49b635704120a0e6e3766cbba50054558826bc81e8f70f9d34f69423f

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for peace_performance_python-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d4f6f07f9b46534a79b4bc209d2354389d923de49192b64b599d7dc18af9f310
MD5 83c48abc2e6b63a6478ae53f67fc963f
BLAKE2b-256 3525d8109ee2f1b9c4d0bf5ed5b5881e5d32d437c8643fb530af042fd9899f4f

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for peace_performance_python-1.0.1-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f96b2fcb39f390bf190ea265710075cb2da71e36c37069f3fd46e57b5e4969e4
MD5 5ea8814a339d66333f66d172dfa3199c
BLAKE2b-256 c789ef6a9fdcf1eb1cba9301635a5237208af46e025c18463d6fb26613c1d5bc

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: peace_performance_python-1.0.1-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 770.3 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for peace_performance_python-1.0.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 9be97f1a4701dfc01be9633e617338be7fe4d55b8a938fde342865383d565234
MD5 5ab0c7042155ae6e89985cf9ea320e5a
BLAKE2b-256 10be2b2c41bdb71505b3dd4432051aaad7fda0bb04fe6853487e6703805156ca

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for peace_performance_python-1.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b1117cca641bc288c1dadf930159c444ac78ab8c411aac4af12b75f64a3295fe
MD5 d8b8d4561756fa6dc43f66b7aacbe88f
BLAKE2b-256 bd073fb502b6995616b98685c492b0ce1646dc6411819d6485990b5c5303faeb

See more details on using hashes here.

File details

Details for the file peace_performance_python-1.0.1-cp36-cp36m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for peace_performance_python-1.0.1-cp36-cp36m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 4698f7cc8c505eaec138cf7fe717b307b88e9527575cd013b38f9b7505076327
MD5 be5b8c80ace1418bd716b0c276466a4b
BLAKE2b-256 dcc96f891670e6010907e26e585879781bb7319213d6384aaaa5fa51365d23d6

See more details on using hashes here.

Supported by

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