- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我写了一个 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/
我是 C 语言新手,我编写了这个 C 程序,让用户输入一年中的某一天,作为返回,程序将输出月份以及该月的哪一天。该程序运行良好,但我现在想简化该程序。我知道我需要一个循环,但我不知道如何去做。这是程序
我一直在努力找出我的代码有什么问题。这个想法是创建一个小的画图程序,并有红色、绿色、蓝色和清除按钮。我有我能想到的一切让它工作,但无法弄清楚代码有什么问题。程序打开,然后立即关闭。 import ja
我想安装screen,但是接下来我应该做什么? $ brew search screen imgur-screenshot screen
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将
我有一个 shell 脚本,它运行一个 Python 程序来预处理一些数据,然后运行一个 R 程序来执行一些长时间运行的任务。我正在学习使用 Docker 并且我一直在运行 FROM r-base:l
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将
对于一个类,我被要求编写一个 VHDL 程序,该程序接受两个整数输入 A 和 B,并用 A+B 替换 A,用 A-B 替换 B。我编写了以下程序和测试平台。它完成了实现和行为语法检查,但它不会模拟。尽
module Algorithm where import System.Random import Data.Maybe import Data.List type Atom = String ty
我想找到两个以上数字的最小公倍数 求给定N个数的最小公倍数的C++程序 最佳答案 int lcm(int a, int b) { return (a/gcd(a,b))*b; } 对于gcd,请查看
这个程序有错误。谁能解决这个问题? Error is :TempRecord already defines a member called 'this' with the same paramete
当我运行下面的程序时,我在 str1 和 str2 中得到了垃圾值。所以 #include #include #include using namespace std; int main() {
这是我的作业: 一对刚出生的兔子(一公一母)被放在田里。兔子在一个月大时可以交配,因此在第二个月的月底,每对兔子都会生出两对新兔子,然后死去。 注:在第0个月,有0对兔子。第 1 个月,有 1 对兔子
我编写了一个程序,通过对字母使用 switch 命令将十进制字符串转换为十六进制,但是如果我使用 char,该程序无法正常工作!没有 switch 我无法处理 9 以上的数字。我希望你能理解我,因为我
我是 C++ 新手(虽然我有一些 C 语言经验)和 MySQL,我正在尝试制作一个从 MySQL 读取数据库的程序,我一直在关注这个 tutorial但当我尝试“构建”解决方案时出现错误。 (我正在使
仍然是一个初学者,只是尝试使用 swift 中的一些基本函数。 有人能告诉我这段代码有什么问题吗? import UIKit var guessInt: Int var randomNum = arc
我正在用 C++11 编写一个函数,它采用 constant1 + constant2 形式的表达式并将它们折叠起来。 constant1 和 constant2 存储在 std::string 中,
我用 C++ 编写了这段代码,使用运算符重载对 2 个矩阵进行加法和乘法运算。当我执行代码时,它会在第 57 行和第 59 行产生错误,非法结构操作(两行都出现相同的错误)。请解释我的错误。提前致谢:
我是 C++ 的初学者,我想编写一个简单的程序来交换字符串中的两个字符。 例如;我们输入这个字符串:“EXAMPLE”,我们给它交换这两个字符:“E”和“A”,输出应该类似于“AXEMPLA”。 我在
我需要以下代码的帮助: 声明 3 个 double 类型变量,每个代表三角形的三个边中的一个。 提示用户为第一面输入一个值,然后 将用户的输入设置为您创建的代表三角形第一条边的变量。 将最后 2 个步
我是新来的,如果问题不好请见谅 任务:将给定矩阵旋转180度 输入: 1 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出: 16 15 14 13 12 11
我是一名优秀的程序员,十分优秀!