Skip to main content

Apache Fury™(incubating) is a blazingly fast multi-language serialization framework powered by jit and zero-copy

Project description


Build Status Slack Channel X Maven Version

Apache Fury (incubating) is a blazingly-fast multi-language serialization framework powered by JIT (just-in-time compilation) and zero-copy, providing up to 170x performance and ultimate ease of use.

https://fury.apache.org

[!IMPORTANT] Apache Fury (incubating) is an effort undergoing incubation at the Apache Software Foundation (ASF), sponsored by the Apache Incubator PMC.

Please read the DISCLAIMER and a full explanation of "incubating".

Features

  • Multiple languages: Java/Python/C++/Golang/JavaScript/Rust/Scala/Kotlin/TypeScript.
  • Zero-copy: Cross-language out-of-band serialization inspired by pickle5 and off-heap read/write.
  • High performance: A highly-extensible JIT framework to generate serializer code at runtime in an async multi-thread way to speed serialization, providing 20-170x speed up by:
    • reduce memory access by inlining variables in generated code.
    • reduce virtual method invocation by inline call in generated code.
    • reduce conditional branching.
    • reduce hash lookup.
  • Multiple binary protocols: Object graph, row format, and so on.

In addition to cross-language serialization, Fury also features at:

  • Drop-in replace Java serialization frameworks such as JDK/Kryo/Hessian, but 100x faster at most, which can greatly improve the efficiency of high-performance RPC calls, data transfer, and object persistence.
  • 100% compatible with JDK serialization API with much faster implementation: supporting JDK writeObject/readObject/writeReplace/readResolve/readObjectNoData/Externalizable API.
  • Supports Java 8~21, Java 17+ record is supported too.
  • Supports AOT compilation serialization for GraalVM native image, and no reflection/serialization json config are needed.
  • Supports shared and circular reference object serialization for golang.
  • Supports scala serialization
  • Supports Kotlin serialization
  • Supports automatic object serialization for golang.

Protocols

Fury designed and implemented multiple binary protocols for different scenarios:

  • xlang serialization format:
    • Cross-language serialize any object automatically, no need for IDL definition, schema compilation and object to/from protocol conversion.
    • Support optional shared reference and circular reference, no duplicate data or recursion error.
    • Support object polymorphism.
  • Java serialization format: Highly-optimized and drop-in replacement for Java serialization.
  • Row format format: A cache-friendly binary random access format, supports skipping serialization and partial serialization, and can convert to column-format automatically.

New protocols can be easily added based on Fury existing buffer, encoding, meta, codegen and other capabilities. All of those share the same codebase, and the optimization for one protocol can be reused by another protocol.

Benchmarks

Different serialization frameworks are suitable for different scenarios, and benchmark results here are for reference only.

If you need to benchmark for your specific scenario, make sure all serialization frameworks are appropriately configured for that scenario.

Dynamic serialization frameworks support polymorphism and references, but they often come with a higher cost compared to static serialization frameworks, unless they utilize JIT techniques like Fury does. To ensure accurate benchmark statistics, it is advisable to warm up the system before collecting data due to Fury's runtime code generation.

Java Serialization

In these charts below, titles containing "compatible" represent schema compatible mode: type forward/backward compatibility is enabled; while titles without "compatible" represent schema consistent mode: class schema must be the same between serialization and deserialization.

Where Struct is a class with 100 primitive fields, MediaContent is a class from jvm-serializers, and Sample is a class from kryo benchmark.

See benchmarks for more benchmarks about type forward/backward compatibility, off-heap support, zero-copy serialization.

Installation

Java

Nightly snapshot:

<repositories>
  <repository>
    <id>apache</id>
    <url>https://repository.apache.org/snapshots/</url>
    <releases>
      <enabled>false</enabled>
    </releases>
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
  </repository>
</repositories>
<dependency>
  <groupId>org.apache.fury</groupId>
  <artifactId>fury-core</artifactId>
  <version>0.11.0-SNAPSHOT</version>
</dependency>
<!-- row/arrow format support -->
<!-- <dependency>
  <groupId>org.apache.fury</groupId>
  <artifactId>fury-format</artifactId>
  <version>0.11.0-SNAPSHOT</version>
</dependency> -->

Release version:

<dependency>
  <groupId>org.apache.fury</groupId>
  <artifactId>fury-core</artifactId>
  <version>0.10.1</version>
</dependency>
<!-- row/arrow format support -->
<!-- <dependency>
  <groupId>org.apache.fury</groupId>
  <artifactId>fury-format</artifactId>
  <version>0.10.1</version>
</dependency> -->

Scala

Scala2:

libraryDependencies += "org.apache.fury" % "fury-scala_2.13" % "0.10.1"

Scala3:

libraryDependencies += "org.apache.fury" % "fury-scala_3" % "0.10.1"

Kotlin

<dependency>
  <groupId>org.apache.fury</groupId>
  <artifactId>fury-kotlin</artifactId>
  <version>0.10.1</version>
</dependency>

Python

pip install pyfury

JavaScript

npm install @furyjs/fury

Golang

go get github.com/apache/fury/go/fury

Quickstart

Here we give a quick start about how to use Fury, see user guide for more details about java, cross language, and row format.

Fury java object graph serialization

If you don't have cross-language requirements, using this mode will result in better performance.

import org.apache.fury.*;
import org.apache.fury.config.*;
import java.util.*;

public class Example {
  public static void main(String[] args) {
    SomeClass object = new SomeClass();
    // Note that Fury instances should be reused between
    // multiple serializations of different objects.
    {
      Fury fury = Fury.builder().withLanguage(Language.JAVA)
        .requireClassRegistration(true)
        .build();
      // Registering types can reduce class name serialization overhead, but not mandatory.
      // If class registration enabled, all custom types must be registered.
      fury.register(SomeClass.class);
      byte[] bytes = fury.serialize(object);
      System.out.println(fury.deserialize(bytes));
    }
    {
      ThreadSafeFury fury = Fury.builder().withLanguage(Language.JAVA)
        .requireClassRegistration(true)
        .buildThreadSafeFury();
      // Registering types can reduce class name serialization overhead, but not mandatory.
      // If class registration enabled, all custom types must be registered.
      fury.register(SomeClass.class);
      byte[] bytes = fury.serialize(object);
      System.out.println(fury.deserialize(bytes));
    }
    {
      ThreadSafeFury fury = new ThreadLocalFury(classLoader -> {
        Fury f = Fury.builder().withLanguage(Language.JAVA)
          .withClassLoader(classLoader).build();
        f.register(SomeClass.class);
        return f;
      });
      byte[] bytes = fury.serialize(object);
      System.out.println(fury.deserialize(bytes));
    }
  }
}

Cross-language object graph serialization

Java

import org.apache.fury.*;
import org.apache.fury.config.*;
import java.util.*;

public class ReferenceExample {
  public static class SomeClass {
    SomeClass f1;
    Map<String, String> f2;
    Map<String, String> f3;
  }

  public static Object createObject() {
    SomeClass obj = new SomeClass();
    obj.f1 = obj;
    obj.f2 = ofHashMap("k1", "v1", "k2", "v2");
    obj.f3 = obj.f2;
    return obj;
  }

  // mvn exec:java -Dexec.mainClass="org.apache.fury.examples.ReferenceExample"
  public static void main(String[] args) {
    Fury fury = Fury.builder().withLanguage(Language.XLANG)
      .withRefTracking(true).build();
    fury.register(SomeClass.class, "example.SomeClass");
    byte[] bytes = fury.serialize(createObject());
    // bytes can be data serialized by other languages.
    System.out.println(fury.deserialize(bytes));
  }
}

Python

from typing import Dict
import pyfury

class SomeClass:
    f1: "SomeClass"
    f2: Dict[str, str]
    f3: Dict[str, str]

fury = pyfury.Fury(ref_tracking=True)
fury.register_type(SomeClass, typename="example.SomeClass")
obj = SomeClass()
obj.f2 = {"k1": "v1", "k2": "v2"}
obj.f1, obj.f3 = obj, obj.f2
data = fury.serialize(obj)
# bytes can be data serialized by other languages.
print(fury.deserialize(data))

Golang

package main

import furygo "github.com/apache/fury/go/fury"
import "fmt"

func main() {
 type SomeClass struct {
  F1 *SomeClass
  F2 map[string]string
  F3 map[string]string
 }
 fury := furygo.NewFury(true)
 if err := fury.RegisterTagType("example.SomeClass", SomeClass{}); err != nil {
  panic(err)
 }
 value := &SomeClass{F2: map[string]string{"k1": "v1", "k2": "v2"}}
 value.F3 = value.F2
 value.F1 = value
 bytes, err := fury.Marshal(value)
 if err != nil {
 }
 var newValue interface{}
 // bytes can be data serialized by other languages.
 if err := fury.Unmarshal(bytes, &newValue); err != nil {
  panic(err)
 }
 fmt.Println(newValue)
}

Row format

Java

public class Bar {
  String f1;
  List<Long> f2;
}

public class Foo {
  int f1;
  List<Integer> f2;
  Map<String, Integer> f3;
  List<Bar> f4;
}

RowEncoder<Foo> encoder = Encoders.bean(Foo.class);
Foo foo = new Foo();
foo.f1 = 10;
foo.f2 = IntStream.range(0, 1000000).boxed().collect(Collectors.toList());
foo.f3 = IntStream.range(0, 1000000).boxed().collect(Collectors.toMap(i -> "k"+i, i->i));
List<Bar> bars = new ArrayList<>(1000000);
for (int i = 0; i < 1000000; i++) {
  Bar bar = new Bar();
  bar.f1 = "s"+i;
  bar.f2 = LongStream.range(0, 10).boxed().collect(Collectors.toList());
  bars.add(bar);
}
foo.f4 = bars;
// Can be zero-copy read by python
BinaryRow binaryRow = encoder.toRow(foo);
// can be data from python
Foo newFoo = encoder.fromRow(binaryRow);
// zero-copy read List<Integer> f2
BinaryArray binaryArray2 = binaryRow.getArray(1);
// zero-copy read List<Bar> f4
BinaryArray binaryArray4 = binaryRow.getArray(3);
// zero-copy read 11th element of `readList<Bar> f4`
BinaryRow barStruct = binaryArray4.getStruct(10);

// zero-copy read 6th of f2 of 11th element of `readList<Bar> f4`
barStruct.getArray(1).getInt64(5);
RowEncoder<Bar> barEncoder = Encoders.bean(Bar.class);
// deserialize part of data.
Bar newBar = barEncoder.fromRow(barStruct);
Bar newBar2 = barEncoder.fromRow(binaryArray4.getStruct(20));

Python

@dataclass
class Bar:
    f1: str
    f2: List[pa.int64]
@dataclass
class Foo:
    f1: pa.int32
    f2: List[pa.int32]
    f3: Dict[str, pa.int32]
    f4: List[Bar]

encoder = pyfury.encoder(Foo)
foo = Foo(f1=10, f2=list(range(1000_000)),
         f3={f"k{i}": i for i in range(1000_000)},
         f4=[Bar(f1=f"s{i}", f2=list(range(10))) for i in range(1000_000)])
binary: bytes = encoder.to_row(foo).to_bytes()
foo_row = pyfury.RowData(encoder.schema, binary)
print(foo_row.f2[100000], foo_row.f4[100000].f1, foo_row.f4[200000].f2[5])

Compatibility

Schema Compatibility

Fury java object graph serialization supports class schema forward/backward compatibility. The serialization peer and deserialization peer can add/delete fields independently.

We plan to add the schema compatibility support of cross-language serialization after meta compression is finished.

Binary Compatibility

We are still improving our protocols, thus binary compatibility is not guaranteed between Fury major releases for now. However, it is guaranteed between minor versions. Please versioning your data by Fury major version if you will upgrade Fury in the future, see how to upgrade fury for further details.

Binary compatibility will be guaranteed when Fury 1.0 is released.

Security

Static serialization is relatively secure. But dynamic serialization such as Fury java/python native serialization supports deserializing unregistered types, which provides more dynamics and flexibility, but also introduce security risks.

For example, the deserialization may invoke init constructor or equals/hashCode method, if the method body contains malicious code, the system will be at risk.

Fury provides a class registration option that is enabled by default for such protocols, allowing only deserialization of trusted registered types or built-in types. Do not disable class registration unless you can ensure your environment is secure.

If this option is disabled, you are responsible for serialization security. You can configure org.apache.fury.resolver.ClassChecker by ClassResolver#setClassChecker to control which classes are allowed for serialization.

To report security vulnerabilities found in Fury, please follow the ASF vulnerability reporting process.

How to Build

Please read the BUILD guide for instructions on how to build.

How to Contribute

Please read the CONTRIBUTING guide for instructions on how to contribute.

License

Licensed under the Apache License, Version 2.0

Apache Fury (Incubating) is an effort undergoing incubation at the Apache Software Foundation (ASF), sponsored by the Apache Incubator PMC.

Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects.

While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

pyfury-0.10.2-cp313-cp313-win_amd64.whl (678.4 kB view details)

Uploaded CPython 3.13 Windows x86-64

pyfury-0.10.2-cp313-cp313-manylinux1_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.13

pyfury-0.10.2-cp313-cp313-macosx_14_0_universal2.whl (832.8 kB view details)

Uploaded CPython 3.13 macOS 14.0+ universal2 (ARM64, x86-64)

pyfury-0.10.2-cp312-cp312-win_amd64.whl (679.3 kB view details)

Uploaded CPython 3.12 Windows x86-64

pyfury-0.10.2-cp312-cp312-manylinux1_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.12

pyfury-0.10.2-cp312-cp312-macosx_14_0_universal2.whl (835.5 kB view details)

Uploaded CPython 3.12 macOS 14.0+ universal2 (ARM64, x86-64)

pyfury-0.10.2-cp311-cp311-win_amd64.whl (688.2 kB view details)

Uploaded CPython 3.11 Windows x86-64

pyfury-0.10.2-cp311-cp311-manylinux1_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.11

pyfury-0.10.2-cp311-cp311-macosx_14_0_universal2.whl (835.9 kB view details)

Uploaded CPython 3.11 macOS 14.0+ universal2 (ARM64, x86-64)

pyfury-0.10.2-cp310-cp310-win_amd64.whl (685.3 kB view details)

Uploaded CPython 3.10 Windows x86-64

pyfury-0.10.2-cp310-cp310-manylinux1_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.10

pyfury-0.10.2-cp310-cp310-macosx_14_0_universal2.whl (769.8 kB view details)

Uploaded CPython 3.10 macOS 14.0+ universal2 (ARM64, x86-64)

pyfury-0.10.2-cp310-cp310-macosx_10_12_x86_64.whl (821.2 kB view details)

Uploaded CPython 3.10 macOS 10.12+ x86-64

pyfury-0.10.2-cp39-cp39-win_amd64.whl (687.4 kB view details)

Uploaded CPython 3.9 Windows x86-64

pyfury-0.10.2-cp39-cp39-manylinux1_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.9

pyfury-0.10.2-cp39-cp39-macosx_14_0_universal2.whl (771.4 kB view details)

Uploaded CPython 3.9 macOS 14.0+ universal2 (ARM64, x86-64)

pyfury-0.10.2-cp39-cp39-macosx_10_12_x86_64.whl (823.1 kB view details)

Uploaded CPython 3.9 macOS 10.12+ x86-64

pyfury-0.10.2-cp38-cp38-win_amd64.whl (688.0 kB view details)

Uploaded CPython 3.8 Windows x86-64

pyfury-0.10.2-cp38-cp38-manylinux1_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.8

pyfury-0.10.2-cp38-cp38-macosx_14_0_universal2.whl (772.7 kB view details)

Uploaded CPython 3.8 macOS 14.0+ universal2 (ARM64, x86-64)

pyfury-0.10.2-cp38-cp38-macosx_10_12_x86_64.whl (825.0 kB view details)

Uploaded CPython 3.8 macOS 10.12+ x86-64

File details

Details for the file pyfury-0.10.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: pyfury-0.10.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 678.4 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyfury-0.10.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bac67ef62bfd2637d47dfa660142a6c4fd1ee9dc52844d57b2215b6ba509f47d
MD5 010ee586ba5e1f303219f3df54ae83fc
BLAKE2b-256 784a6b6c065ddb79e03f382b65258ff19ec8004bd400b728c94972849dbbcc7a

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp313-cp313-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f122da17ac16eb2f661cda3c8f83770d8502a66d046f696a7e5fa00f5634abe9
MD5 d073e9e429010dcbedc6631122edd002
BLAKE2b-256 e97ca165dbd94189779e67e0b6524ec905176172da18b471dc465e65208d8f6e

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp313-cp313-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp313-cp313-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 90b1c4ce6a4918ebcad512d970d1edb379e79478d3bde174a98fb24c321f8515
MD5 d818b456918851aa061c1333d8902cce
BLAKE2b-256 b65173bbad18e9bdbf1704d9349ebbd293a2e4c497a823685a47ccdeb8bde7ee

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pyfury-0.10.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 679.3 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyfury-0.10.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 aa12b1ff83b220b7b67599b845804e0d33cf65958b53f47c760680e733ddf55d
MD5 7c6d7e39513feb32ec383b9bfc6404c0
BLAKE2b-256 76a32e94da51f0c70e5a42acb71438dcca0d262d2cda0096d9e2cffa5c3da94a

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp312-cp312-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c865735aa90f9386c153f547016b9dbea8f90ad3413f5fd3d4d4c76a8fa23e34
MD5 03ff9c235ec19aae03a8eeebcd8ff910
BLAKE2b-256 93f1f04b0d96d5e958a3734607dbe91c96f2aecd343bc0bfea2532dd944ec862

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp312-cp312-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp312-cp312-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 30aa7f76aba32e8458dad3061aa68e7ccfab6accbbe18f15196b09e88a8d16b0
MD5 d9106ab683adb1468069522428302ca1
BLAKE2b-256 e7264836439bf51f2cc4864ba1317ff83fc8dcbc556bc72f8f03e74585fdff57

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: pyfury-0.10.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 688.2 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyfury-0.10.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c04a2f96d431e047441d470c3ba5131658578356bf39e3d458bbb8037c83868d
MD5 cc361090aaefda25a65a3f1799a31608
BLAKE2b-256 581e9e1539f71bb03d356ad529e63277cf2634bff9c1fa9c79ef059a2d953a71

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp311-cp311-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cb27719e0888b6fc91efd27679870be7c70da3dab0a1519a251bd4540c3c905d
MD5 2952ecd7a46af298e4badc93e391dd2f
BLAKE2b-256 87f7e3fb9712a6d0cc93cb1743ddcf60a9057ac4f11462069c07ff3fe98a182f

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp311-cp311-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp311-cp311-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 6670cfdd734d2f5825cdb9a72cdaaef2d60274628346eb69588d223e5f2b52c5
MD5 02305d9da25491fc44ebc8f6d3b658ea
BLAKE2b-256 c68f0e8de16c7f0bf8b592e6a7847b0906e7bfcc71c362ef1d87160506e8140e

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: pyfury-0.10.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 685.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyfury-0.10.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d2bdc080c8932757292e7db36fc851f38ae4b7c4faa6594e1b69529b225d7752
MD5 279f1a6ec2c39ea11c8e534447d9b870
BLAKE2b-256 3c83e686c635f321b790fa68d3cfb0e192393f3d74f3282b103c15160e9ba60c

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp310-cp310-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 dc8d554a46882bf62872ee45dbf8bb1abd3f6adc93ec8c42c9d9928a967cc6e8
MD5 a7e24bfc6dd139363d6192f22296db71
BLAKE2b-256 9e415a97ae7714152354743ccd2b005b503d095a8c63ef54345025dc4aa77b56

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp310-cp310-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp310-cp310-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 102e90d91a65ab1750b958fe2009569ffc011ffd505b26e5d137a3ee96b61910
MD5 245897d64b29f9aa86888c7a304fda40
BLAKE2b-256 df8c1eca6c04512e81b30af8ab5b86424207b81347960bcde50335cbf9fc4c67

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e1366425adbfe064bfd7b14eb14504b2b310a910a75a373168733283fa332c73
MD5 c2d8202060780ae0db8908dda7557d6d
BLAKE2b-256 a140d054867ad7d4381792649a8523da8505c72732259c97fb7a13c677a9733f

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: pyfury-0.10.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 687.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyfury-0.10.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ce291f6bf0940a44247dadef0d8787a3b4cb839c08bad3ed0ff536ccc2f8110f
MD5 26d07ce4e6a7f1ed347aba609e975c1e
BLAKE2b-256 2723a535ad46dacd7068e9f3cf326c9e6d4c52730ccdc275d3d96c1f926eaf9b

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp39-cp39-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 8aec1f7079e633839f695ede12a921c0875678febbb1daeb4bddbe021ee9741e
MD5 5bbb80414d778088c1d59b240593ba0f
BLAKE2b-256 3e856ecc05c3c8190841225ffbd58a42980cf6cd3f25966afce27c7eb53df60d

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp39-cp39-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp39-cp39-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 b489dfcad51bf5251266df89aaeb5696fce6dc96abaae1731d3d59b9930245d3
MD5 9f28e20cfd216922e76b7329b70f0947
BLAKE2b-256 ab8bd8de1cc584654a5b16932752966275204f97cba860aa718a6453e94ae6bc

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a91f356e18ce59b5ade37f901dcd636c19a2efbf67127d7f1dcb79c5f5c60a40
MD5 4afd4d90b59cd7e11179aa4f99779656
BLAKE2b-256 4a54ba6711f59f34ad207b4be13c70442e873ecc798a720395ab60eb5661a64e

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: pyfury-0.10.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 688.0 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyfury-0.10.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 26545c4a72cc8b51c20c469ce6fb7ba095c8acf7f3c09e20c62a99fefcad1cab
MD5 90722ba396e6a900acc31ce6816146af
BLAKE2b-256 977797aa98d37e1f07d2676f92c82457f08d6db94b99fe56c4dd85ff8ab0982b

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp38-cp38-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c3eb8e177978dcf39d33d44333030aedc0089cef46334d01e09b5071ad739eb2
MD5 b3d12c21377beabfdbd605f691c57963
BLAKE2b-256 70ecb67f64e7922e3138394dec9f29f032cb5c9bece70901105af150ef8e60e9

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp38-cp38-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp38-cp38-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 f3c0a0254cc443622b8e9b988638ba9c009b5caa58147dc93feef5a44d5d5c54
MD5 030cbaa7846de234a55e837591ac6c8e
BLAKE2b-256 f9368c6fca5bd50c85756e29055c2fe34c581d60a7b3aaba76eb6ed8b3823471

See more details on using hashes here.

File details

Details for the file pyfury-0.10.2-cp38-cp38-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyfury-0.10.2-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0083702cbfa93e4eb7035a17e97960d2283a56a3052b733ff658a6867a828efd
MD5 a5a90e985cf5bf72e3e3648a65ad4dd7
BLAKE2b-256 7945d1323506f638fd4505390e1f2956167229f319a9921c4acc5f0e9c027dfc

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 Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page