使用 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 位整数 的相关文章

  • 操作数无法与形状 (128,) (0,) 错误一起广播

    我正在尝试实现面部识别登录系统 但出现错误 操作数无法与形状 128 0 一起广播 我不知道什么或如何解决它 这是我已实现的 view py 和 FaceDetector py 以及我从服务器收到的错误 errors Traceback m
  • PyList_SetItem 与 PyList_SETITEM

    据我所知 PyList SetItem 和 PyList SETITEM 之间的区别在于 PyList SetItem 会降低它覆盖的列表项的引用计数 而 PyList SETITEM 不会 我有什么理由不应该一直使用 PyList Set
  • Spark MLlib - 训练隐式警告

    我在使用时不断看到这些警告trainImplicit WARN TaskSetManager Stage 246 contains a task of very large size 208 KB The maximum recommend
  • Python:记录垃圾收集器

    我有一个 python 应用程序 有一些性能问题 我想将垃圾收集器的事件 特别是何时调用 添加到我的日志中 是否可以 thanks http docs python org library gc html gc set debug http
  • 为什么在 Windows 中使用 GetConsoleScreenBufferInfoEx 时控制台窗口会缩小?

    我正在尝试使用 GetConsoleScreenBufferInfoEx 和 SetConsoleScreenBufferInfoEx 设置 Windows 命令行控制台的背景和前景色 我正在 Python 中使用 wintypes 进行此
  • html 解析器 python

    我正在尝试解析一个网站 我正在使用 HTMLParser 模块 问题是我想解析第一个 a href 评论后 但我真的不知道该怎么做 所以我在文档中发现有一个函数叫做handle comment 但我还没有找到如何正确使用它 我有以下内容 i
  • 如何在 ReportLab 段落中插入回车符?

    有没有办法在 ReportLab 的段落中插入回车符 我试图将 n 连接到我的段落字符串 但这不起作用 Title Paragraph Title n Page myStyle 我想要这样做 因为我将名称放入单元格中 并且想要控制单元格中的
  • 如何找到列表S的所有分区为k个子集(可以为空)?

    我有一个唯一元素列表 比方说 1 2 我想将其拆分为 k 2 个子列表 现在我想要所有可能的子列表 1 2 1 2 2 1 1 2 我想分成 1 1 2 我怎样才能用 Python 3 做到这一点 更新 我的目标是获取 N 个唯一数字列表的
  • 为什么我的scoped_session 引发 AttributeError: 'Session' object has no attribute 'remove'

    我正在尝试建立一个系统 将数据库操作优雅地推迟到单独的线程 以避免在 Twisted 回调期间发生阻塞 到目前为止 这是我的方法 from contextlib import contextmanager from sqlalchemy i
  • 如何使用 Pandas 将巨大的 CSV 转换为 SQLite?

    我有一个巨大的表 大约 60 GB 采用存档的 CSV 文件形式 我想将其转换为 SQLite 文件 我现在所做的事情如下 import pandas import sqlite3 cnx sqlite3 connect db sqlite
  • 网页抓取 - 前往第 2 页

    如何访问数据集的第二页 无论我做什么 它都只返回第 1 页 import bs4 from urllib request import urlopen as uReq from bs4 import BeautifulSoup as sou
  • 杂乱的扭曲连接在不干净的时尚中消失了。没有代理。已经尝试过标题

    我正在尝试抓取这个网站 https www5 apply2jobs com jupitermed ProfExt index cfm fuseaction mExternal searchJobs https www5 apply2jobs
  • Django - 电子邮件发送两次

    每当我使用如下所示的电子邮件设置从views py调用下面的方法时 电子邮件的两份副本都会发送给收件人 并且我收到如下所示的错误 def sendEmailBasic request msg EmailMessage Request Cal
  • Python 视频框架

    我正在寻找一个 Python 框架 它将使我能够播放视频并在该视频上绘图 用于标记目的 我尝试过 Pyglet 但这似乎效果不是特别好 在现有视频上绘图时 会出现闪烁 即使使用双缓冲和所有这些好东西 而且似乎没有办法在每帧回调期间获取视频中
  • Matplotlib 图例不工作

    自从升级 matplotlib 以来 每当尝试创建图例时 我都会收到以下错误 usr lib pymodules python2 7 matplotlib legend py 610 UserWarning Legend does not
  • 如何在 Python 中从 HTML 页面中提取 URL [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须用Python 编写一个网络爬
  • 求解不等式系统时“多项式错误:仅允许使用单变量多项式”

    我想找到以下两个常数的区间cons1 and cons2我写了下面的代码 from sympy import Poly from sympy import Abs from sympy solvers inequalities import
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • Jupyter Notebook:没有名为 pandas 的模块

    我搜索了其他问题 但没有找到任何有帮助的内容 大多数只是建议您使用 conda 或 pip 安装 pandas 在我的 jupyter 笔记本中 我试图导入 pandas import pandas as pd 但我收到以下错误 Modul
  • SQLAlchemy:避免声明式样式类定义中的重复

    我正在使用 SQLAlchemy 并且我的对象模型中的许多类具有相同的两个属性 id 和 整数和主键 以及名称 字符串 我试图避免在每个类中声明它们 如下所示 class C1 declarative base id Column Inte

随机推荐

  • 创建方案 .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 位整数有什么想