generated from dopt-python/py311-cython
experiments with Cython
This commit is contained in:
parent
a7e9bc9bc1
commit
245b9532b9
19
pdm.lock
generated
19
pdm.lock
generated
@ -5,7 +5,7 @@
|
|||||||
groups = ["default", "dev", "lint", "nb", "tests"]
|
groups = ["default", "dev", "lint", "nb", "tests"]
|
||||||
strategy = ["inherit_metadata"]
|
strategy = ["inherit_metadata"]
|
||||||
lock_version = "4.5.0"
|
lock_version = "4.5.0"
|
||||||
content_hash = "sha256:71768c573eb20af8acecbc83c097fa086cd4b05e483dd1da4671252ec7d16329"
|
content_hash = "sha256:c0680aa00cf7474d542ab72daaea39fe9f3c23b3b68f724f49da67b2d74ff588"
|
||||||
|
|
||||||
[[metadata.targets]]
|
[[metadata.targets]]
|
||||||
requires_python = ">=3.11"
|
requires_python = ">=3.11"
|
||||||
@ -759,6 +759,20 @@ files = [
|
|||||||
{file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"},
|
{file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dopt-basics"
|
||||||
|
version = "0.2.4"
|
||||||
|
requires_python = ">=3.11"
|
||||||
|
summary = "basic cross-project tools for Python-based d-opt projects"
|
||||||
|
groups = ["default"]
|
||||||
|
dependencies = [
|
||||||
|
"tzdata>=2025.1",
|
||||||
|
]
|
||||||
|
files = [
|
||||||
|
{file = "dopt_basics-0.2.4-py3-none-any.whl", hash = "sha256:b7d05b80dde1f856b352580aeac500fc7505e4513ed162791d8735cdc182ebc1"},
|
||||||
|
{file = "dopt_basics-0.2.4.tar.gz", hash = "sha256:c21fbe183bec5eab4cfd1404e10baca670035801596960822d0019e6e885983f"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "execnet"
|
name = "execnet"
|
||||||
version = "2.1.2"
|
version = "2.1.2"
|
||||||
@ -2530,8 +2544,7 @@ name = "tzdata"
|
|||||||
version = "2025.2"
|
version = "2025.2"
|
||||||
requires_python = ">=2"
|
requires_python = ">=2"
|
||||||
summary = "Provider of IANA time zone data"
|
summary = "Provider of IANA time zone data"
|
||||||
groups = ["nb"]
|
groups = ["default", "nb"]
|
||||||
marker = "python_version >= \"3.9\""
|
|
||||||
files = [
|
files = [
|
||||||
{file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"},
|
{file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"},
|
||||||
{file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"},
|
{file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"},
|
||||||
|
|||||||
@ -5,7 +5,7 @@ description = "blockchain module of the research project >Polluck<"
|
|||||||
authors = [
|
authors = [
|
||||||
{name = "d-opt GmbH, resp. Florian Foerster", email = "f.foerster@d-opt.com"},
|
{name = "d-opt GmbH, resp. Florian Foerster", email = "f.foerster@d-opt.com"},
|
||||||
]
|
]
|
||||||
dependencies = []
|
dependencies = ["dopt-basics>=0.2.4"]
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = {text = "LicenseRef-Proprietary"}
|
license = {text = "LicenseRef-Proprietary"}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -1,18 +1,47 @@
|
|||||||
"""placeholder module for compilation"""
|
"""placeholder module for compilation"""
|
||||||
|
|
||||||
import typing as t
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
import cython
|
import cython
|
||||||
from cython.cimports.cpython.ref import Py_INCREF
|
import dopt_basics.datetime
|
||||||
|
|
||||||
|
# from cython.cimports.cpython.ref import Py_INCREF, PyObject
|
||||||
|
|
||||||
|
PyStringC = cython.struct(
|
||||||
|
ptr=cython.p_char,
|
||||||
|
length=cython.Py_ssize_t,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@cython.cfunc
|
||||||
|
def PyStringC_to_unicode(
|
||||||
|
string: PyStringC,
|
||||||
|
) -> str:
|
||||||
|
return string.ptr[: string.length].decode("UTF-8", "strict")
|
||||||
|
|
||||||
|
|
||||||
|
@cython.cfunc
|
||||||
|
def PyStringC_to_bytes(
|
||||||
|
string: PyStringC,
|
||||||
|
) -> bytes:
|
||||||
|
return cython.cast(bytes, string.ptr[: string.length])
|
||||||
|
|
||||||
|
|
||||||
|
@cython.cfunc
|
||||||
|
def timestamp_to_datetime(
|
||||||
|
ts: cython.double,
|
||||||
|
) -> datetime.datetime:
|
||||||
|
return datetime.datetime.fromtimestamp(ts, dopt_basics.datetime.TIMEZONE_UTC)
|
||||||
|
|
||||||
|
|
||||||
@cython.cclass
|
@cython.cclass
|
||||||
class StringHolder:
|
class StringHolder:
|
||||||
_data = cython.declare(cython.p_char, visibility="private")
|
c = cython.declare(PyStringC, visibility="readonly")
|
||||||
_length = cython.declare(cython.Py_ssize_t, visibility="readonly")
|
_py_data = cython.declare(object, visibility="private")
|
||||||
_py_cache = cython.declare(object, visibility="private")
|
|
||||||
|
|
||||||
def __cinit__(self, data: str) -> None:
|
def __cinit__(self, data: str):
|
||||||
"""accepting Python str
|
"""accepting Python str
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
@ -23,23 +52,68 @@ class StringHolder:
|
|||||||
if not isinstance(data, str):
|
if not isinstance(data, str):
|
||||||
raise TypeError("Data not 'str'")
|
raise TypeError("Data not 'str'")
|
||||||
|
|
||||||
tmp = data.encode("utf-8")
|
self._py_data = data.encode("UTF-8")
|
||||||
Py_INCREF(tmp)
|
self.c = PyStringC(self._py_data, len(self._py_data))
|
||||||
self._data = tmp
|
|
||||||
self._length = len(tmp)
|
|
||||||
self._py_cache = None
|
|
||||||
|
|
||||||
@cython.cfunc
|
|
||||||
def _bytes_to_str(self) -> str:
|
|
||||||
tmp = t.cast(bytes, self._data[: self._length])
|
|
||||||
return tmp.decode("utf-8")
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def py_string(self) -> str:
|
def py_string(self):
|
||||||
if self._py_cache is None:
|
return PyStringC_to_unicode(self.c)
|
||||||
self._py_cache = self._bytes_to_str()
|
|
||||||
return t.cast(str, self._py_cache)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def py_bytes(self) -> bytes:
|
def py_bytes(self):
|
||||||
return t.cast(bytes, self._data[: self._length])
|
return PyStringC_to_bytes(self.c)
|
||||||
|
|
||||||
|
|
||||||
|
# BlockC = cython.struct(
|
||||||
|
# index=cython.ulonglong,
|
||||||
|
# timestamp=cython.double,
|
||||||
|
# data=PyStringC,
|
||||||
|
# previous_hash=PyStringC,
|
||||||
|
# nonce=cython.ulonglong,
|
||||||
|
# )
|
||||||
|
|
||||||
|
|
||||||
|
@cython.cclass
|
||||||
|
class Block:
|
||||||
|
_index = cython.declare(cython.ulong, visibility="private")
|
||||||
|
_timestamp = cython.declare(cython.double, visibility="private")
|
||||||
|
_data = cython.declare(StringHolder, visibility="private")
|
||||||
|
_prev_hash = cython.declare(StringHolder, visibility="private")
|
||||||
|
_nonce = cython.declare(cython.ulong, visibility="private")
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
index: int,
|
||||||
|
data: str,
|
||||||
|
previous_hash: str,
|
||||||
|
nonce: int,
|
||||||
|
):
|
||||||
|
self._index = index
|
||||||
|
self._timestamp = dopt_basics.datetime.current_time_tz().timestamp()
|
||||||
|
self._data = StringHolder.__new__(StringHolder, data)
|
||||||
|
self._prev_hash = StringHolder.__new__(StringHolder, previous_hash)
|
||||||
|
self._nonce = nonce
|
||||||
|
|
||||||
|
@property
|
||||||
|
def index(self):
|
||||||
|
return self._index
|
||||||
|
|
||||||
|
@property
|
||||||
|
def timestamp(self):
|
||||||
|
return timestamp_to_datetime(self._timestamp)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def data(self):
|
||||||
|
return self._data.py_string
|
||||||
|
|
||||||
|
@property
|
||||||
|
def prev_hash(self):
|
||||||
|
return self._prev_hash.py_string
|
||||||
|
|
||||||
|
@property
|
||||||
|
def nonce(self):
|
||||||
|
return self._nonce
|
||||||
|
|
||||||
|
@nonce.setter
|
||||||
|
def nonce(self, value: int):
|
||||||
|
self._nonce = value
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user