Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用回调将C库(GSL)包装在cython代码中

使用回调将C库(GSL)包装在cython代码中
EN

Stack Overflow用户
提问于 2014-07-01 06:49:28
回答 2查看 1.3K关注 0票数 2

我是cythonc的新手。我想使用cython来提高代码的性能。我希望在代码中使用gsl_integration库进行集成。更新:test_gsl.pyx

代码语言:javascript
运行
AI代码解释
复制
cdef extern from "math.h":
    double log(double x) nogil
cdef extern from "gsl/gsl_math.h":
    ctypedef struct gsl_function:
        double (* function) (double x, void * params)
        void * params

cdef extern from "gsl/gsl_integration.h":
    ctypedef struct gsl_integration_workspace
    gsl_integration_workspace *  gsl_integration_workspace_alloc(size_t n)
    void  gsl_integration_workspace_free(gsl_integration_workspace * w)

    int  gsl_integration_qags(const gsl_function * f, double a, double b, double epsabs, double epsrel, size_t limit, gsl_integration_workspace * workspace, double *result, double *abserr)


cdef double do_callback(double x, void* params):
    return (<MyCallback>params).eval(x)

cdef class MyCallback:
    cdef double a
    def __init__(self, a):
        self.a = a
    cpdef double eval(self, double x):
        return self.a * log(x+1) * x
    def call_gsl(self):
        cdef gsl_integration_workspace* w =gsl_integration_workspace_alloc (1000)

        cdef gsl_function F
        F.function = &do_callback
        F.params = <void*>self

        cdef double result = 3, error = 5
        gsl_integration_qags(&F, 0, 1, 0, 1e-7, 1000, w, &result, &error)
        print result, error
        gsl_integration_workspace_free(w)

.pyx代码使用以下setup.py文件编译,不会引发任何错误消息:

代码语言:javascript
运行
AI代码解释
复制
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
import sys 
ext = Extension("test_gsl", ["test_gsl.pyx"],
    include_dirs=[numpy.get_include(),
                  "/usr/include/"],
    library_dirs=["/usr/lib/"],
    libraries=["gsl"])

setup(ext_modules=[ext],
    cmdclass = {'build_ext': build_ext})

或者即使使用命令行:

代码语言:javascript
运行
AI代码解释
复制
cython test_gsl.pyx
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/vol/anaconda/lib/python2.7/site-packages -I/usr/include -I/vol/anaconda/include/python2.7 -c test_gsl.c `pkg-config --cflags gsl` 
gcc -pthread -shared test_gsl.o -L/usr/lib -L/vol/anaconda/lib -lgsl -lgslcblas -lpython2.7 `pkg-config --libs gsl` -o test_gsl.so

在python中导入时,它确实会引发错误:

代码语言:javascript
运行
AI代码解释
复制
>>> import pyximport; pyximport.install()
(None, <pyximport.pyximport.PyxImporter object at 0x7f0c7e888150>)
>>> import gsl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/anaconda/lib/python2.7/site-packages/Cython-0.20.1-py2.7-linux-x86_64.egg/pyximport/pyximport.py", line 431, in load_module
    language_level=self.language_level)
  File "/anaconda/lib/python2.7/site-packages/Cython-0.20.1-py2.7-linux-x86_64.egg/pyximport/pyximport.py", line 210, in load_module
    mod = imp.load_dynamic(name, so_path)
ImportError: Building module gsl failed: ['ImportError: /users/dalek/.pyxbld/lib.linux-x86_64-2.7/gsl.so: undefined symbol: gsl_integration_qags\n']

gsl_integration_qags已经被正确地定义了,我不明白为什么我再次得到这个错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-07 02:30:37

在用以下命令编译它之后:

代码语言:javascript
运行
AI代码解释
复制
cython test_gsl.pyx
gcc -m64 -pthread -fno-strict-aliasing -Wstrict-prototypes -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/include -I/vol/dalek/anaconda/include/python2.7 -c test_gsl.c -o build/temp.linux-x86_64-2.7/test_gsl.o
gcc -pthread -shared -L/usr/lib/ -L/vol/dalek/anaconda/lib -o test_gsl.so  build/temp.linux-x86_64-2.7/test_gsl.o -lpython2.7  -lgsl -lgslcblas -lm

如果我在没有test_gsl的python中导入pyximport,它就能很好地工作。因为pyximport不支持针对外部库的链接。

票数 1
EN

Stack Overflow用户

发布于 2014-07-02 14:17:37

第一条规则:过早优化是万恶之源。 第二条规则:不惜一切代价遵循第一条规则。 第三条规则:如果没有必要使用C++复杂特性(与C相比,这包括类)(即使您像我一样是C++狂热者)。如果将C++与C库混合使用,则尤其如此。

我看不出为什么C++类在您的示例中是必需的,特别是因为您通过这样做创建了不必要的间接(包装器)!如果您使用编译语言编写代码以提高性能,则需要避免不必要的步骤和间接操作!你无缘无故地让你的生活变得困难,尤其是因为C中的GSL例程将完成程序中99.9%的计算。为什么不直接使用像cython-gsl这样的东西,然后继续编写类似的代码(取自cython示例文件夹)。由于python没有做任何繁重的工作(假设foo()函数将被转换成C-情况似乎是这样),这是更短、更简洁的,而且我也看不出它为什么会表现得不好!

代码语言:javascript
运行
AI代码解释
复制
from cython_gsl cimport *

ctypedef double * double_ptr ctypedef void * void_ptr

cdef double foo(double x, void * params) nogil:
    cdef double alpha, f
    alpha = (<double_ptr> params)[0]
    f = log(alpha*x) / sqrt(x)
    return f


def main():
    cdef gsl_integration_workspace * w
    cdef double result, error, expected, alpha
    w = gsl_integration_workspace_alloc (1000)

    expected = -4.0
    alpha = 1

    cdef gsl_function F
    F.function = &foo
    F.params = &alpha

    gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000, w, &result, &error)
    print "result          = % .18f\n" % result
    print "estimated error          = % .18f\n" % error
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24513246

复制
相关文章
利用cython将python转为c代码
3. gcc `python-config --cflags` `python-config --ldflags` test.c -o test
py3study
2020/01/08
1.8K0
Python标准库shutil中rmtree()使用回调函数
这段代码目的是删除包含只读文件的文件夹,主要演示回调函数的用法。 >>> import os >>> import stat >>> import shutil >>> def remove_readonly(func, path, _): #定义回调函数 os.chmod(path, stat.S_IWRITE) #删除文件的只读属性 func(path) #再次执行删除操作 >>> shutil.rmtree('D:
Python小屋屋主
2018/04/16
1.9K0
使用Cython将Python代码转为C语言,从而提高代码保密性
Cython是Python编程语言和扩展 Cython 编程语言(基于Pyrex)的优化静态编译器。 它使得为 Python 编写 C 扩展就像 Python 本身一样容易。这允许编译器从 Cython 代码生成C代码。 显而易见的是,它能将python代码翻译为C代码,然后生成符合Python/C API的动态链接库。这样就能更好的保护你的python源码不被破解。例如你的代码包含了核心的量化交易策略。将其转为机器语言才能更好的保护你的核心代码。另外一方面,Cython也带来了一些扩展,使得你可以通过添加静态类型声明,将原本的python代码的性能逼近纯C语言的性能。
zy010101
2022/09/21
5.5K0
C++核心准则​GSL:指南支持库
The GSL is a small library of facilities designed to support this set of guidelines. Without these facilities, the guidelines would have to be far more restrictive on language details.
面向对象思考
2020/11/17
1.1K0
用回调函数调用异步流回调函数内的数据
本文的标题看起来也许比较绕,看不懂也没关系,后面会慢慢说明。写这篇文章是为了记录一下前几天我碰到的一个问题。
凌虚
2020/07/18
2K0
用回调函数调用异步流回调函数内的数据
用Cython加速Python代码
要在我们的笔记本中使用Cython,我们将使用IPython magic命令。Magic命令以百分号开始,并提供一些额外的功能,这些功能可以增强工作流。通常,有两种类型的Magic命令:
hankleo
2020/09/17
6380
ubuntu上R语言安装gsl包
报错如下: * installing *source* package ‘gsl’ ... ** package ‘gsl’ successfully unpacked and MD5 sums ch
生信技能树
2019/07/30
2.6K0
浅谈javascript中的回调函数javascript中的函数匿名函数回调函数回调函数的使用回调函数实例总结
要理解javascript中的回调函数,首先我们就要对javascript中的函数有一定的理解,所以我们先从javascript中函数谈起,讲讲它与其他语言中的函数有什么不同。
desperate633
2018/08/22
3K0
浅谈javascript中的回调函数javascript中的函数匿名函数回调函数回调函数的使用回调函数实例总结
使用Cython保护Python源代码
使用Cython保护Python源代码 **保护您的Python源不受不必要的影响,说起来容易做起来难,因为.pyc字节码是可反编译的,并且混淆很容易被反向工程。我花了一段时间才弄清楚隐藏Python代码的正确方法...... Cython是一个优化的静态编译器,可以将.py模块转换为高性能的C文件,生成的C文件可以毫不费力地编译到本机二进制库中。编译完成后,无法将编译库转换回可读的Python源代码! 1. 安装 Cython pip install cython 2. 添加 hello.pyx 假
py3study
2020/01/13
2.3K0
VS2005下使用GSL-1.15小结
最近在复习高等数学,有时为了验证顺便复习下C语言,看了看自己下载收集的软件,发现C语言有一个数学工具包,是GNU开发的,叫做GSL——GNU Scientific Library,中文:C++科学计算库,主页为www.gnu.org/s/gsl/,主要是在linux环境下运行的,幸好牛人们已经做好了windows版的移植(有条件的就在linux下编译gsl喽),有:Gsl for Windows - GnuWin32 - SourceForge,https://code.google.com/p/oscats/(gsl-1.15-dev-win32.zip 5.9 MB),也可以在windows下安装MSYS或是cygwin下编译源代码获得适合在windows下运行的动态链接库等,具体的我也不太清楚,网上看了,具体的编译流程比较复杂,索性直接下载牛人们编译好的。
用户4645519
2020/09/07
8040
Python中的cython介绍
Cython是一种用于将Python代码转换为C或C++代码的编译器。它是Python和C/C++之间的一种桥梁,可以提供更高的执行效率和更好的性能。Cython既是一种编程语言,也是一种编译器,它可以将Python代码转换为C或C++代码,并在编译时将其转换为机器码,以提高代码的执行速度。
大盘鸡拌面
2023/10/12
7280
C++核心准则​GSL.view:视图
These types allow the user to distinguish between owning and non-owning pointers and between pointers to a single object and pointers to the first element of a sequence.
面向对象思考
2020/11/16
5080
用Cython加速Python代码,快到起飞!
为了能够使用Cython,您需要一个C编译器。因此,安装过程会根据您当前的操作系统而有所不同。对于Linux,通常存在GNUC编译器(gncc)。对于Mac OS,您可以下载Xcode来获得gncc。如果您应该使用Windows,安装过程会稍微复杂一些。更多信息请访问Cython’s GitHub。
小小詹同学
2019/08/02
7650
用Cython加速Python代码,快到起飞!
如果您曾经用Python编写过代码,那么等待某些代码块执行的时间可能比您希望的要长。虽然有一些方法可以提高代码的效率,但它很可能仍然比C代码慢。这主要归结为一个事实:Python是一种动态编程语言,它将许多东西移动到C在编译期间负责的运行时。
Python数据科学
2019/07/30
8270
用Cython加速Python代码,快到起飞!
用Cython加速Python代码,快到起飞!
如果您曾经用Python编写过代码,那么等待某些代码块执行的时间可能比您希望的要长。虽然有一些方法可以提高代码的效率,但它很可能仍然比C代码慢。这主要归结为一个事实:Python是一种动态编程语言,它将许多东西移动到C在编译期间负责的运行时。
AiTechYun
2019/07/30
1.1K0
用Cython加速Python代码,快到起飞!
什么使DevOps中的代码审查良好?[DevOps]
改善软件开发生命周期,向客户交付软件的速度以及该软件的质量都是DevOps的重要前提。这些是DevOps运动规定的工具和技术试图达到的目标。作为开发人员,感到很自由,可以快速进行更改,不仅可以更改源代码,还可以更改基础结构和配置代码。作为DevOps的从业者,目标是在质量与安全性之间实现平衡。如何?可以使用的一种工具是代码审查。
yyx
2019/12/24
9830
什么使DevOps中的代码审查良好?[DevOps]
假装在测试 关于 BurpSuite抓包(一)
BurpSuite主要是用在Web安全测试的一款工具,并且在Web安全测试方面,BurpSuite这款工具非常强大,功能很多,用来抓包在合适不过.
顾翔
2019/12/11
1.3K0
假装在测试 关于 BurpSuite抓包(一)
30倍!使用Cython加速Python代码
如果你的代码是纯Python。如果你有一个很大的for循环,你只能使用它,而不能放入矩阵中,因为数据必须按顺序处理,那该怎么办?有没有办法加快Python本身的速度?
量化投资与机器学习微信公众号
2019/07/30
1.8K0
30倍!使用Cython加速Python代码
使用Cython加速你的Python代码
如果您曾经用Python编写过代码,那么您可能花费了比您希望的更多的时间等待某些代码块的执行。虽然有一些方法可以提高代码的效率,但是它很可能仍然比C代码慢。这主要归结为Python是一种动态编程语言,并将许多C在编译期间负责的事情转移到运行。
HuangWeiAI
2020/07/27
9840
使用Cython加速你的Python代码
点击加载更多

相似问题

Cython、C++和gsl

20

cython-gsl库包装器

10

将cython与gsl结合使用

13

Cython:如何将您自己的cython模块封装在一个包中?

12

用cython调用C代码,从c中调用cython代码

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档