使用 ctypes 处理 128 位整数

2023-12-20

使用 Python ctypes 支持 128 位整数(当前为 __uint128_t)的最佳方式是什么?

可能是两个 uint64_t 的用户定义结构,但这会在需要时产生对齐问题。

关于为什么 ctypes 没有扩展到支持 128 位整数有什么想法吗?


如果您确实想使用 128 位integers那么你就不需要担心对齐问题。当前没有任何架构、没有任何运行 Python 的机器支持 128 位本机整数运算。因此,没有机器需要或受益于 128 位整数 16 字节对齐。只需使用用户定义的结构就可以了。

如果您真正需要的是对 128 位的支持vector类型,那么您可能需要将它们对齐。也就是说,如果您在 Python 代码中创建它们并通过引用 C/C++ 代码传递它们,则需要将它们对齐。您无法可靠地按值传递它们,无法让 ctypes 在堆栈上正确对齐它们(如果架构 ABI 需要的话)。从 C/C++ 传递到 Python 的向量可能已经正确对齐。因此,如果您可以安排它,以便所有向量都在 C/C++ 代码中分配,您也应该可以使用用户定义的结构。

假设您确实需要在 Python 代码中创建对齐向量,那么我已经包含了对齐 ctypes 数组的代码。我还有代码来对齐其他 ctypes 类型,但我没有将其包含到合理的代码大小中。数组对于大多数用途来说应该足够了。这些对齐的阵列有一些限制。如果将它们按值传递给 C/C++ 函数或者将它们作为成员包含在结构体或联合中,它们将无法正确对齐。您可以使用以下命令创建对齐数组的对齐数组*操作员。

Use aligned_array_type(ctypes-type, length, alignment)创建新的对齐数组类型。使用aligned_type(ctypes-type, alignment)创建现有数组类型的对齐版本。

import ctypes

ArrayType = type(ctypes.Array)

class _aligned_array_type(ArrayType):
    def __mul__(self, length):
        return aligned_array_type(self._type_ * self._length_,
                      length, self._alignment_)

    def __init__(self, name, bases, d):
        self._alignment_ = max(getattr(self, "_alignment_", 1), 
                       ctypes.alignment(self))

def _aligned__new__(cls):
    a = cls._baseclass_.__new__(cls)
    align = cls._alignment_
    if ctypes.addressof(a) % align == 0:
        return a
    cls._baseclass_.__init__(a) # dunno if necessary
    ctypes.resize(a, ctypes.sizeof(a) + align - 1)
    addr = ctypes.addressof(a)
    aligned = (addr + align - 1) // align * align
    return cls.from_buffer(a, aligned - addr)

class aligned_base(object):
    @classmethod
    def from_address(cls, addr):
        if addr % cls._alignment_ != 0:
            raise ValueError, ("address must be %d byte aligned"
                       % cls._alignment_)
        return cls._baseclass_.from_address(cls, addr)

    @classmethod
    def from_param(cls, addr):
        raise ValueError, ("%s objects may not be passed by value"
                   % cls.__name__)

class aligned_array(ctypes.Array, aligned_base):
    _baseclass_ = ctypes.Array
    _type_ = ctypes.c_byte
    _length_ = 1
    __new__ = _aligned__new__

_aligned_type_cache = {}

def aligned_array_type(typ, length, alignment = None):
    """Create a ctypes array type with an alignment greater than natural"""

    natural = ctypes.alignment(typ)
    if alignment == None:
        alignment = typ._alignment_
    else:
        alignment = max(alignment, getattr(typ, "_alignment_", 1))

    if natural % alignment == 0:
        return typ * length
    eltsize = ctypes.sizeof(typ)
    eltalign = getattr(typ, "_alignment_", 1)
    if eltsize % eltalign != 0:
        raise TypeError("type %s can't have element alignment %d"
                " in an array" % (typ.__name__, alignment))
    key = (_aligned_array_type, (typ, length), alignment)
    ret = _aligned_type_cache.get(key)
    if ret == None:
        name = "%s_array_%d_aligned_%d" % (typ.__name__, length,
                           alignment)
        d = {"_type_": typ,
             "_length_": length,
             "_alignment_": alignment}
        ret = _aligned_array_type(name, (aligned_array,), d)
        _aligned_type_cache[key] = ret
    return ret

def aligned_type(typ, alignment):
    """Create a ctypes type with an alignment greater than natural"""

    if ctypes.alignment(typ) % alignment == 0:
        return typ
    if issubclass(typ, ctypes.Array):
        return aligned_array_type(typ._type_, typ._length_,
                      alignment)
    else:
        raise TypeError("unsupported type %s" % typ)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ctypes 处理 128 位整数 的相关文章

  • 散景图只会弹出一个空白窗口

    所以我最近一直在尝试学习散景 一切都很顺利 但突然间 每当我尝试制作散景图时 浏览器就会显示一个空白页面 我没有收到任何错误代码 只有空白页 这是我几天前成功用来创建绘图的程序 我什至尝试加载几周前制作的 html 绘图文件 该文件在同事计
  • 将 ical 附件的邮件消息的内容类型设置为“text/calendar; method=REQUEST”

    我正在尝试使用 App Engine 邮件 API 从 App Engine 发送 iCalendar 格式的 ics 文件 这在 GMail 中非常有效 但是 Outlook 无法识别该文件 我认为问题在于内容类型设置为 文本 日历 而不
  • 在 SQLAlchemy 中,过滤器是在连接之前还是之后应用?

    使用 SQLAlchemy 我执行如下查询 import models as m import sqlalchemy as sa s session maker q s query m ShareCount m Article join m
  • virtualenvwrapper 函数在 shell 脚本中不可用

    所以 我再一次制作了一个很棒的 python 程序 它让我的生活变得更加轻松 并节省了大量时间 当然 这涉及到一个 virtualenv 用mkvirtualenvvirtualenvwrapper 的功能 该项目有一个requiremen
  • Discord.py 斜线命令在 cogs 中不起作用

    我正在构建一个不和谐的机器人 并且想要在 cogs 内使用斜杠命令 但这些命令不显示或工作 这是代码 cog guild ids 858573429787066368 861507832934563851 class Slash comma
  • 如何在plotly(python)中的刻度标签和图形之间添加空格?

    如果我使用绘图创建水平条形图 则每个条形的标签都与图表相对应 我想在标签和图表之间添加一些空间 填充 边距 我怎样才能做到这一点 Example import plotly offline as py import plotly graph
  • NumPy 数组与 SQLite

    我在 Python 中见过的最常见的 SQLite 接口是sqlite3 但是有什么东西可以很好地与 NumPy 数组或 rearray 配合使用吗 我的意思是 它可以识别数据类型 不需要逐行插入 并提取到 NumPy rec 数组中 有点
  • DataFrame.loc 的“索引器太多”

    我读了关于切片器的文档 http pandas pydata org pandas docs stable advanced html using slicers一百万次 但我从来没有理解过它 所以我仍在试图弄清楚如何使用loc切片Data
  • Python Apache Beam 端输入断言错误

    我对 Apache Beam Cloud Dataflow 还很陌生 所以如果我的理解不正确 我深表歉意 我正在尝试通过管道读取大约 30 000 行长的数据文件 我的简单管道首先从 GCS 打开 csv 从数据中提取标题 通过 ParDo
  • 将列表值转换为 pandas 中的行

    我有数据帧 其中一列具有相同长度的 numpy ndarray 值 df list 0 Out 92 array 0 0 0 0 29273096 0 30691767 0 27531403 我想将这些列表值转换为数据框并从 df iloc
  • 当元组列表中相同项目的值是字符串时,对它们的值求和

    如果我有这样的元组列表 my list books 5 books 10 ink 20 paper 15 paper 20 paper 15 我怎样才能把列表变成这样 books 15 ink 20 paper 50 即添加同一项目的费用
  • matplotlib vlines 图中未应用 y 轴的最小值

    我正在 matplotlib 中绘制 vlines 图 数据集中的所有 y 值如下 gt 0 我希望 y 轴最底部的刻度能够读取0 但相反 我得到 500 这是代码 usr bin env python import numpy as np
  • 为什么 pip 已经是最新的了却要求我升级?

    我全新安装了 python 3 7 1 64 位 并使用最新的 pyCharm 作为我的 IDE 我在这台机器上没有安装其他 python 我去安装 numpy 并收到以下消息 venv C Users John PycharmProjec
  • 类变量:“类列表”与“类布尔值”[重复]

    这个问题在这里已经有答案了 我不明白以下示例的区别 一次类的实例可以更改另一个实例的类变量 而另一次则不能 示例1 class MyClass object mylist def add self self mylist append 1
  • 列表中的特定范围(python)

    我有一个从文本字符串中提取的整数列表 因此当我打印该列表 我称之为test I get 135 2256 1984 3985 1991 1023 1999 我想打印或制作一个仅包含特定范围内的数字的新列表 例如1000 2000之间 我尝试
  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • 如何使用 python 模块的多个 git 分支?

    我想使用 git 来同时处理我正在编写的模块中的多个功能 我目前正在使用 SVN 只有一个工作区 因此我的 PYTHONPATH 上只有该工作区 我意识到这不太理想 所以我想知道是否有人可以建议一种更 正确 的方法来做到这一点 让我用一个假
  • 关闭正在运行代码的 IPython Notebook

    怎么运行的 我在 IPython Notebook 中运行了一些代码 一些迭代工作 我不小心关闭了正在运行的笔记本的浏览器 但回到 IPython 仪表板 我发现这个特定的笔记本尚未关闭 所以如果我再次打开笔记本 我会在它正在执行的代码前面
  • 美丽的汤刮 - 登录凭据不起作用

    尝试使用登录凭据抓取页面 payload email gmail com password urls login url https www spotrac com signin url https www spotrac com nba
  • 如何使 Django 自定义管理命令参数不再需要?

    我正在尝试在 django 中编写自定义管理命令 如下所示 class Command BaseCommand def add arguments self parser parser add argument delay type int

随机推荐

  • 创建方案 .avsc Avro 时出现问题

    我在创建 avro 方案时遇到问题 下面我将放置我的方案 推特 avsc type record name twitter schema namespace com miguno avro fields name id type recor
  • 发送 X11 点击事件不适用于某些窗口

    以下代码片段在大多数情况下都有效 除了在某些窗口中 例如 在最新的 Ubuntu 下 它无法在文件资源管理器中选择文件夹 它似乎在其他地方都适用 但这个差距是巨大的 我怀疑这与我使用 XQueryPointer 的方式有关 但我已经尝试了几
  • 在 Laravel 4 中构建 SAAS 的正确方法

    好吧 大约一年前 我编写了一个网络应用程序 可以帮助为我父亲的公司组织约会 现在他 没有它就无法做生意 我决定建立一个 SAAS 订阅模式并向公众开放 它目前基于 codeigniter 和 php 构建 我认为这不太适合 SAAS 版本
  • Java 中的 InterruptedException 处理

    以下处理方式有什么区别InterruptedException 最好的方法是什么 try catch InterruptedException e Thread currentThread interrupt OR try catch In
  • 检查给定字符串是否有效匹配一组前缀

    使用什么算法来检查给定字符串是否与一组前缀匹配 以及该组中的哪个前缀 其他变体 给定路径和一组目录 如何检查路径是否在一组目录中 假设没有符号链接 或者它们不重要 我对算法的描述或名称感兴趣 或者解决这个问题的 Perl 模块 或者可以用来
  • CakePHP:使用不同数据库关联两个模型?

    我有两个模型 Plant 和 Emp 它们具有 Has And Belongs To Many 关系 我已将它们配置为关联 并且获取每个数据的查询是正确的 但问题是 Plant 和 Emp 位于不同的数据库上 Emp 位于数据库 1 上 P
  • 如何使用 C# 向文件中插入字符

    我有一个巨大的文件 我必须在其中的特定位置插入某些字符 在 C 中执行此操作而无需再次重写整个文件的最简单方法是什么 文件系统不支持在文件中间 插入 数据 如果您确实需要一个可以以排序方式写入的文件 我建议您考虑使用嵌入式数据库 您可能想看
  • 如何使用捆绑器重新安装 gem

    I did a bundle show并获取 gem 目录的完整路径 不幸的是 我使用删除了目录rm r gem path 然后我的 Rails 应用程序不再工作了 如果我尝试启动服务器或启动 Rails 控制台 它会输出以下错误
  • 地图和列表中的 ModCount

    在调试 eclispse 中的集合时 我只是检查是否存在名为 modCount 的东西 例如 如果我们调试列表 我们将在调试中检查此 modCount 代表的内容时看到 请告知 请参阅 javadoc 该列表的结构修改次数 结构修改是那些改
  • 将不同的 CSS 应用于不同的 jQuery 日期选择器

    我有几个与输入字段绑定的日期选择器 它们以通常的方式创建 input1 datepicker options1 input2 datepicker options2 现在我想为每个领域设置不同的样式 但是当在 Firefox 中检查页面时
  • 将多个列表理解转换为单个列表理解

    我正在尝试使用列表理解来更改列表的值我可以通过使用 3 个列表理解来做到这一点 clr 1 2 2 1 3 1 2 3 clr green if i 1 else i for i in clr clr yellow if i 2 else
  • 阿普塔纳工作室3.3.1。 JavaScript 代码补全

    我是 Aptana 的新手 刚刚开始了一个本质是 Web 的项目 我在代码完成方面遇到两个问题 在网上做了一些研究 但没有找到解决方案 1 我有这两行代码 var script document createElement script s
  • 如何在 XML+XSL 生成的 HTML 中使用 jQuery 来操作 UL?

    这是 XML
  • Kotlin:迭代 JSONArray

    我正在使用 Kotlin 和 Realm 编写 Android 应用程序 我有一个 JSONArray 我想迭代该数组中的 JSONObject 以便将它们加载到 Realm 数据库类中 境界等级 import io realm Realm
  • 统一成本搜索实施

    I am trying to implement the Uniform Cost Search after watching the Intro to AI course in Udacity However my algorithm i
  • 是否可以*仅*跨子子域共享表单身份验证?

    我知道我可以跨 2 个子域共享表单身份验证sub1 domain com sub2 domain com通过使用以下 Web config 设置
  • PDO 中的预备语句真的能提高安全性吗?

    我想知道那些准备好的 PDO 语句是否真的提高了安全性 或者它们只是查询中的 廉价 文本替换 准备好的语句的要点实际上是 无论作为参数插入什么 都不会被 DBMS 解析为指令本身的一部分 因此像这样的参数 DROP TABLE foobar
  • 如何使用 XSLT 进行通配符匹配?

    如果我有这样的源文件
  • ARKit 放置一个面向相机的 SCNNode

    我在用着ARKit显示 3D 对象 我设法将现实世界中的节点放置在用户 又称相机 面前 但当我放下它们时 我无法让它们面对镜头 let tap point CGPoint x x y y let results arscn view hit
  • 使用 ctypes 处理 128 位整数

    使用 Python ctypes 支持 128 位整数 当前为 uint128 t 的最佳方式是什么 可能是两个 uint64 t 的用户定义结构 但这会在需要时产生对齐问题 关于为什么 ctypes 没有扩展到支持 128 位整数有什么想