# Apache Fury™ Python
Apache Fury(incubating) is a blazingly-fast multi-language serialization framework powered by just-in-time compilation and zero-copy.
## Important Announcement
**Apache Fury has been renamed to Apache Fory starting from v0.11.0, please use [pyfory](https://pypi.org/project/pyfory/) instead.**
**For versions before 0.11, please use "fury" instead of "fory" in package names, imports, and dependencies, see [Fury Docs](https://fory.apache.org/docs/0.10/docs/introduction/) for how to use Fury in older versions**.
## Install Pyfury
```
pip install pyfury
```
For `0.11+` version, please install pyfory instead:
```
pip install pyfory
```
## Getting Started
### Object graph serialization
```python
from dataclasses import dataclass
import pyfory
class Foo:
name: str:
age: int
pyfory.register(Foo)
bytes = pyfory.serialize(Foo("Shawn", 30)) # Ultra-fast encoding
restored = pyfory.deserialize(bytes) # Instant decoding
```
### Row format zero-copy serialization
```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
```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])
```
Raw data
{
"_id": null,
"home_page": null,
"name": "pyfury",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": "\"https://github.com/chaokunyang\" <shawn.ck.yang@gmail.com>",
"keywords": "fury, serialization, multi-language, fast, row-format, jit, codegen, polymorphic, zero-copy",
"author": null,
"author_email": "chaokunyang <shawn.ck.yang@gmail.com>",
"download_url": null,
"platform": null,
"description": "# Apache Fury\u2122 Python\n\nApache Fury(incubating) is a blazingly-fast multi-language serialization framework powered by just-in-time compilation and zero-copy.\n\n## Important Announcement\n\n**Apache Fury has been renamed to Apache Fory starting from v0.11.0, please use [pyfory](https://pypi.org/project/pyfory/) instead.**\n\n**For versions before 0.11, please use \"fury\" instead of \"fory\" in package names, imports, and dependencies, see [Fury Docs](https://fory.apache.org/docs/0.10/docs/introduction/) for how to use Fury in older versions**.\n\n## Install Pyfury\n\n```\npip install pyfury\n```\n\nFor `0.11+` version, please install pyfory instead:\n\n```\npip install pyfory\n```\n\n## Getting Started\n\n### Object graph serialization\n\n```python\nfrom dataclasses import dataclass\nimport pyfory\n\nclass Foo:\n name: str:\n age: int\npyfory.register(Foo)\nbytes = pyfory.serialize(Foo(\"Shawn\", 30)) # Ultra-fast encoding\nrestored = pyfory.deserialize(bytes) # Instant decoding\n```\n\n### Row format zero-copy serialization\n\n```java\npublic class Bar {\n String f1;\n List<Long> f2;\n}\n\npublic class Foo {\n int f1;\n List<Integer> f2;\n Map<String, Integer> f3;\n List<Bar> f4;\n}\n\nRowEncoder<Foo> encoder = Encoders.bean(Foo.class);\nFoo foo = new Foo();\nfoo.f1 = 10;\nfoo.f2 = IntStream.range(0, 1000000).boxed().collect(Collectors.toList());\nfoo.f3 = IntStream.range(0, 1000000).boxed().collect(Collectors.toMap(i -> \"k\"+i, i->i));\nList<Bar> bars = new ArrayList<>(1000000);\nfor (int i = 0; i < 1000000; i++) {\n Bar bar = new Bar();\n bar.f1 = \"s\"+i;\n bar.f2 = LongStream.range(0, 10).boxed().collect(Collectors.toList());\n bars.add(bar);\n}\nfoo.f4 = bars;\n// Can be zero-copy read by python\nBinaryRow binaryRow = encoder.toRow(foo);\n// can be data from python\nFoo newFoo = encoder.fromRow(binaryRow);\n// zero-copy read List<Integer> f2\nBinaryArray binaryArray2 = binaryRow.getArray(1);\n// zero-copy read List<Bar> f4\nBinaryArray binaryArray4 = binaryRow.getArray(3);\n// zero-copy read 11th element of `readList<Bar> f4`\nBinaryRow barStruct = binaryArray4.getStruct(10);\n\n// zero-copy read 6th of f2 of 11th element of `readList<Bar> f4`\nbarStruct.getArray(1).getInt64(5);\nRowEncoder<Bar> barEncoder = Encoders.bean(Bar.class);\n// deserialize part of data.\nBar newBar = barEncoder.fromRow(barStruct);\nBar newBar2 = barEncoder.fromRow(binaryArray4.getStruct(20));\n```\n\n### Python\n\n```python\n@dataclass\nclass Bar:\n f1: str\n f2: List[pa.int64]\n@dataclass\nclass Foo:\n f1: pa.int32\n f2: List[pa.int32]\n f3: Dict[str, pa.int32]\n f4: List[Bar]\n\nencoder = pyfury.encoder(Foo)\nfoo = Foo(f1=10, f2=list(range(1000_000)),\n f3={f\"k{i}\": i for i in range(1000_000)},\n f4=[Bar(f1=f\"s{i}\", f2=list(range(10))) for i in range(1000_000)])\nbinary: bytes = encoder.to_row(foo).to_bytes()\nfoo_row = pyfury.RowData(encoder.schema, binary)\nprint(foo_row.f2[100000], foo_row.f4[100000].f1, foo_row.f4[200000].f2[5])\n```\n",
"bugtrack_url": null,
"license": null,
"summary": "Apache Fury\u2122(incubating) is a blazingly fast multi-language serialization framework powered by jit and zero-copy",
"version": "0.10.3",
"project_urls": null,
"split_keywords": [
"fury",
" serialization",
" multi-language",
" fast",
" row-format",
" jit",
" codegen",
" polymorphic",
" zero-copy"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "4b48ef0f03f867f4f29b57eec22b57e731f9add895556423c41e75644d20e022",
"md5": "5c79dc38c08ba1b42ba29a11e57faf2d",
"sha256": "8e4a392fea4ab60c48ab7357e131cf7d582c69d59e7ce04bc4aa7e0efe647bb0"
},
"downloads": -1,
"filename": "pyfury-0.10.3-cp310-cp310-manylinux1_x86_64.whl",
"has_sig": false,
"md5_digest": "5c79dc38c08ba1b42ba29a11e57faf2d",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 1119164,
"upload_time": "2025-08-18T12:24:24",
"upload_time_iso_8601": "2025-08-18T12:24:24.424464Z",
"url": "https://files.pythonhosted.org/packages/4b/48/ef0f03f867f4f29b57eec22b57e731f9add895556423c41e75644d20e022/pyfury-0.10.3-cp310-cp310-manylinux1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1285af123033204a41583ece685928fcc3e9030dd979e27ab0f6ee43d82ae5c2",
"md5": "ab73520c8c6096517dcc4480e58197c5",
"sha256": "b6aa40b269d0ad38c89b126614456ed7984f7f7f6dc1e3046f828aa959d85bc1"
},
"downloads": -1,
"filename": "pyfury-0.10.3-cp311-cp311-manylinux1_x86_64.whl",
"has_sig": false,
"md5_digest": "ab73520c8c6096517dcc4480e58197c5",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 1120538,
"upload_time": "2025-08-18T12:08:34",
"upload_time_iso_8601": "2025-08-18T12:08:34.644933Z",
"url": "https://files.pythonhosted.org/packages/12/85/af123033204a41583ece685928fcc3e9030dd979e27ab0f6ee43d82ae5c2/pyfury-0.10.3-cp311-cp311-manylinux1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e5971154f29600d0c23ad08622a355de27dc259a66862de603e21fb708e6ac02",
"md5": "2d7224a28032ae1b1752c2e250691aec",
"sha256": "b0a9a58f5f828adaed74fc43d9d8c60406411a34432826bababc492ff1a488ee"
},
"downloads": -1,
"filename": "pyfury-0.10.3-cp312-cp312-manylinux1_x86_64.whl",
"has_sig": false,
"md5_digest": "2d7224a28032ae1b1752c2e250691aec",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 1124853,
"upload_time": "2025-08-18T12:24:08",
"upload_time_iso_8601": "2025-08-18T12:24:08.599823Z",
"url": "https://files.pythonhosted.org/packages/e5/97/1154f29600d0c23ad08622a355de27dc259a66862de603e21fb708e6ac02/pyfury-0.10.3-cp312-cp312-manylinux1_x86_64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-18 12:24:24",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "pyfury"
}