gpt4 book ai didi

python - 一种快速连续多次将python中的数百万项传递给C程序的方法

转载 作者:太空狗 更新时间:2023-10-30 00:52:10 25 4
gpt4 key购买 nike

我写了一个 python 脚本,需要将数百万个项目传递给 C 程序并在短时间内多次接收其输出(传递从 1 到 1000 万个顶点数据(整数索引和 2 个浮点坐标)快速 500 次,每次 python 脚本调用 C 程序时,我需要将返回值存储在变量中)。我已经实现了一种读取和写入文本和/或二进制文件的方法,但它很慢而且不智能(为什么在 python 脚本终止后不需要存储数据时将文件写入硬盘?)。我尝试使用管道,但对于大数据,它们给了我错误...所以,到目前为止,我认为最好的方法是使用 ctypes 的能力在 .dll 中加载函数因为我从来没有创建过 dll,所以我想知道如何设置它(我知道很多 ide 都有一个模板,但是当我尝试打开它时我的 wxdev-c++ 崩溃了。现在我正在下载代码:: block )

你能告诉我我开始实现的解决方案是否正确,或者是否有更好的解决方案?我需要在 python 中调用的 2 个函数是这些

void find_vertex(vertex *list, int len, vertex* lower, vertex* highter)
{
int i;
*lower=list[0];
*highter=list[1];
for(i=0;i<len;i++)
{
if ((list[i].x<=lower->x) && (list[i].y<=lower->y))
*lower=list[i];
else
{
if ((list[i].x>=highter->x) && (list[i].y>=highter->y))
*highter=list[i];
}
}
}

vertex *square_list_of_vertex(vertex *list,int len,vertex start, float size)
{
int i=0,a=0;
unsigned int *num;
num=(int*)malloc(sizeof(unsigned int)*len);
if (num==NULL)
{
printf("Can't allocate the memory");
return 0;
}
//controlls which points are in the right position and adds their index from the main list in another list
for(i=0;i<len;i++)
{
if ((list[i].x-start.x)<size && (list[i].y-start.y<size))
{
if (list[i].y-start.y>-size/100)
{
num[a]=i;
a++;//len of the list to return
}
}
}

//create the list with the right vertices
vertex *retlist;
retlist=(vertex*)malloc(sizeof(vertex)*(a+1));
if (retlist==NULL)
{
printf("Can't allocate the memory");
return 0;
}
//the first index is used only as an info container
vertex infos;
infos.index=a+1;
retlist[0]=infos;

//set the value for the return pointer
for(i=1;i<=a;i++)
{
retlist[i]=list[num[i-1]];
}

return retlist;
}

编辑:忘记发布顶点的类型定义

typedef struct{
int index;
float x,y;
} vertex;

编辑2:我将重新分发代码,所以我不喜欢在 python 中使用外部模块和在 C 中使用外部程序。Alsa 我想尝试保持代码跨平台。该脚本是 3D 应用程序的插件,因此它使用的外部“东西”越少越好。

最佳答案

使用 ctypes 或 Cython 包装您的 C 函数绝对是正确的选择。这样,您甚至不需要在 C 和 Python 代码之间复制数据——C 和 Python 部分都在同一进程中运行并访问相同的数据。让我们坚持使用 ctypes,因为这是您的建议。此外,使用 NumPy 将使这一切变得更加舒适。

我推断您的 vertex 类型如下所示:

typedef struct
{
int index;
float x, y;
} vertex;

要将这些顶点放在 NumPy 数组中,您可以为其定义一个记录“dtype”:

vertex_dtype = [('index', 'i'), ('x', 'f'), ('y', 'f')]

同时将此类型定义为 ctypes 结构:

class Vertex(ctypes.Structure):
_fields_ = [("index", ctypes.c_int),
("x", ctypes.c_float),
("y", ctypes.c_float)]

现在,函数 find_vertex()ctypes 原型(prototype)将如下所示:

from numpy.ctypeslib import ndpointer
lib = ctypes.CDLL(...)
lib.find_vertex.argtypes = [ndpointer(dtype=vertex_dtype, flags="C_CONTIGUOUS"),
ctypes.c_int,
ctypes.POINTER(Vertex),
ctypes.POINTER(Vertex)]
lib.find_vertex.restypes = None

要调用此函数,请创建一个 NumPy 顶点数组

vertices = numpy.empty(1000, dtype=vertex_dtype)

返回值的两个结构

lower = Vertex()
higher = Vertex()

最后调用你的函数:

lib.find_vertex(vertices, len(vertices), lower, higher)

NumPy 和 ctypes 将负责将指向 vertices 数据开头的指针传递给您的 C 函数——无需复制。

您可能需要阅读一些关于 ctypes 和 NumPy 的文档,但我希望这个答案能帮助您开始使用它。

关于python - 一种快速连续多次将python中的数百万项传递给C程序的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4997831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com