Tag: python

python高效子字符串搜索

可能重复: 如何在CPython中实现string.find? 我在这里阅读了很多关于堆栈溢出的post比较子字符串搜索的性能(例如Python字符串搜索效率 , 这是搜索子字符串的最有效方法吗? , python中的子字符串等等) 我还看了一下包含abstract.c的源代码实现。 据我所知,内置实现是迭代的: python docs python是否有更多足够的技术来实现查找子字符串: Boyer-Moore算法 , Rabin-Karp算法等…… ??? 编辑 问题已经扩展: Python:通过嵌入复杂的算法改进子字符串搜索 。

挑选一个Python扩展类型,定义为具有PyObject *成员的C结构

我正在通过Python运行C ++代码,并希望挑选一个扩展类型。 所以我有一个C ++结构(py_db_manager),它包含指向数据库对象的指针和一个用python类型对象(t_db_manager)包装的对象管理器对象(都是用C ++编写的)。 我的问题是这个python类型需要知道如何pickle两个指针,以便将它发送到一些子多核进程。 所以我用copy_reg模块注册了这个类型(这相当于在类型上编写了一个reduce ()方法。但是,我不太清楚要放入什么内容。我应该用PyObject *构建一个元组,还是仅仅是整数指针?有人可以帮忙吗? typedef struct { PyObject_HEAD PyObject* man_inst_ ; PyObject* db_inst_ ; }py_db_manager;` 这是Py_TypeObject PyTypeObject t_db_manager = { PyObject_HEAD_INIT(0) /* tp_head */ 0, /* tp_internal */ “.py_db_manager”, /* tp_name */ sizeof(py_db_manager)}; 这里是reduce方法中的代码: PyObject *pickle_manager(PyObject *module, PyObject *args) { py_db_manager *cpp_manager =0; PyObject *values = NULL, *tuple = NULL; […]

串行调用mpi二进制文件作为mpi应用程序的子进程

我有一个大型并行(使用MPI)模拟应用程序,它可以生成大量数据。 为了评估这些数据,我使用了一个python脚本。 我现在需要做的是运行此应用程序很多次(> 1000)并从结果数据计算统计属性。 到目前为止,我的方法是让一个python脚本并行运行(使用mpi4py,使用ie节点),使用subprocess.check_call调用模拟代码。 我需要这个调用来串行运行我的mpi模拟应用程序。 在这种情况下,我不需要模拟并行运行。 然后python脚本可以并行分析数据,并在完成后启动新的模拟运行,直到累积大量运行。 目标是 不保存2000次运行的整个数据集 将中间数据保存在内存中 Stub MWE: file multi_call_master.py : from mpi4py import MPI import subprocess print “Master hello” call_string = ‘python multi_call_slave.py’ comm = MPI.COMM_WORLD rank = comm.Get_rank() size = comm.Get_size() print “rank %d of size %d in master calling: %s” % (rank, size, call_string) std_outfile = “./sm_test.out” […]

使用Swig在Python模块中包装C-enum

我在myenum.h中的C中有一个简单的枚举: enum MyEnum { ONE, TWO, THREE }; 问题是当我将它映射到Python时,我只能通过模块名称访问枚举,而不是通过MyEnum。 因此值ONE,TWO,THREE包含在我定义的任何其他函数中,而不是包含在MyEnum中。 我的api.i文件是: %module api %{ #include “myenum.h” %} %include “myenum.h” 我用SWIG生成 swig -builtin -python api.i 并将其导入Python import _api 现在我必须使用_api模块中的枚举值: _api.ONE _api.TWO _api.THREE 虽然我想像他们一样使用它们 _api.MyEnum.ONE _api.MyEnum.TWO _api.MyEnum.THREE 有谁知道我怎么能做到这一点?

如何解决C&Python混合编程时的“分段故障”?

在我的Ubuntu下: $ cat test.py #Filename test.py def Hello(): print “Hello, world!” $ cat tom.cpp #include int main() { Py_Initialize(); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule = PyImport_ImportModule(“test”); pFunc = PyObject_GetAttrString(pModule, “Hello”); PyEval_CallObject(pFunc, NULL); Py_Finalize(); return 0; } 然后编译它: g++ tom.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7 运行:$ ./a.out Segmentation fault 为什么? 有人可以帮忙吗? 谢谢! […]

获取Cython指针的值

我正在编写一个函数,构造一个malloc’d unsigned char *数组,然后返回指针。 在纯Cython或C中,这很容易。 您所要做的就是在函数上设置返回类型,并将指针返回到数组。 完成。 但是,我已经达到了一个点,我需要将一个指向Cython中创建的数组的指针返回给Python。 我知道指针只是内存地址。 有没有什么方法可以返回一个Python的Python指针作为python对象(如int或hex,因为内存地址本质上是一个数字),所以我可以基本上管理python中的指针? 我试图像这样返回指针的值: cdef unsigned char array[8] def return_pointer(): return &array 这当然不起作用,因为转换不能完成。 Cython抱怨Cannot convert ‘unsigned char (*)[8]’ to Python object 。 有什么建议? 编辑: 我不需要访问Python中指针引用的内存地址中的值,只需传递指针。 然后我计划使用Python对象指针,并用它作为参数调用c函数。

用ctypes从python调用c:传递向量

我想使用ctypes从python调用ac函数。 从文档中我不明白如何将指针传递给向量。 我要调用的函数是: double f(int n, double* x) { int i; double p=1; for (i=0; i< n; i ++) p = p * x[i]; return p; } 我用void指针修改了函数,因此它变为f(int, void*) ,内部强制转换为double。 我做了以下事情: def f(x): n = len(x) libc = ‘/path/to/lib.so’ cn = c_int(n) px = pointer(x) cx = c_void_p(px) libc.restype = c_double L = libc.f(cn, cx) […]

在Python中加速矩阵向量乘法和求幂,可能通过调用C / C ++

我目前正在研究机器学习项目 – 给定数据矩阵Z和向量rho – 我必须计算rho处逻辑损失函数的值和斜率。 计算涉及基本的矩阵向量乘法和log / exp运算,以避免数值溢出(在上一篇文章中描述)。 我目前正在使用NumPy在Python中执行此操作,如下所示(作为参考,此代码运行时间为0.2秒)。 虽然这很好用,但我想加快速度,因为我在代码中多次调用该函数(它代表了我项目中90%以上的计算)。 我正在寻找任何方法来改善没有并行化的代码的运行时间(即只有1个CPU)。 我很高兴使用Python中任何公开的软件包,或者调用C或C ++(因为我听说这可以将运行时间提高一个数量级)。 预处理数据矩阵Z也可以。 为了更好的计算可以利用的一些事情是矢量rho通常是稀疏的(大约50%的条目= 0)并且通常存在比列多得多的行(在大多数情况下n_cols <= 100 ) import time import numpy as np np.__config__.show() #make sure BLAS/LAPACK is being used np.random.seed(seed = 0) #initialize data matrix X and label vector Y n_rows, n_cols = 1e6, 100 X = np.random.random(size=(n_rows, n_cols)) Y = np.random.randint(low=0, […]

在Xcode for Mac中编译和链接Python的C扩展

我正在尝试在Mac中编译一个简单的C扩展以与Python一起使用,并且在命令行中一切运行良好。 有效的代码和gcc命令如下所示。 现在我正在尝试在Xcode 4.5(Mac OS10.8)中构建相同的扩展,并且我尝试了dylib或静态库的几个目标设置,但是我总是得到一个无法用Python加载的文件,显示错误: ./myModule.so: unknown file type, first eight bytes: 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 我的最终目标是在XCode中创建一个工作区,其中包含C / C ++扩展的源代码,并具有在Xcode中调用它的python脚本。 所以,如果我需要调试C / C ++扩展,我有XCode调试function。 我知道XCode不会调试到Python脚本,但它可以运行它,对吗? gcc -shared -arch i386 -arch x86_64 -L/usr/lib/python2.7 -framework python -I/usr/include/python2.7 -o myModule.so myModule.c -v #include /* * Function to be called from Python */ static PyObject* […]

在c中读取python的全局变量

我正在努力学习如何正确使用Python / C API – 我真正需要做的就是读取一个全局变量(在我的案例中是字典 – 但我从一个简单的整数变量开始)。 使用讨论: 如何从C访问Python全局变量? 那里的答案来源: http : //bytes.com/topic/python/answers/705918-c-api-embedded-python-how-get-set-named-variables我写了这个小东西: Python代码(tryStuff.py): var1 = 1 var2 = [‘bla’, ‘blalba’] var3 = {“3” : “Three”, “2” : “Two”, “1” : “One”, “0” : “Ignition!”} print “end of file – tryStuff!!” C代码(embedPythonTry.c): #include int main(int argc, char **argv){ Py_Initialize(); PyRun_SimpleString(“import sys”); PyRun_SimpleString(“sys.path.append(”)”); PyImport_ImportModule(“tryStuff”); printf(“After […]