2006年06月02日 星期五 12:41
倒是这两天我也在看这方面的问题~ 一般编写Python C/C++ Module,或者为C/C++ lib编写Wrapper,我所看到的有以下几 种方式: 1. 直接使用C Python提供的API 2. SWIG 3. Boost.Python 4. Pyrex 首先直接使用Python C API是很不方便的。上面几位高人已经谈过了SWIG和 Boost.Python,我就不多说了,只是个人感觉易用性而言Boost.Python > SWIG,但 SWIG功能强大,支持的也只不只是Python一种脚本语言。以上这两种方式对C++的支持 都比较友好。 这里着重推荐一下Pyrex (http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/)。 Pyrex可以说是扩展Python的一大创新,她使用Python like的语法来编写Python的C Module,自动翻译成C语言代码,进而编译获取C代码的高效率。而且,配合Python的 Distutils,使得构建过程简单到了只需要setup.py的程度。我觉得其简化python扩展 的编写方式,已经和Boost.python,SWIG不在一个意义级别上了。 这里贴一段来自pyrex的示例,用于搜索质数: # primes.pyx # # Calculate prime numbers # def primes(int kmax): cdef int n, k, i cdef int p[1000] result = [] if kmax > 1000: kmax = 1000 k = 0 n = 2 while k < kmax: i = 0 while i < k and n % p[i] 0: i = i + 1 if i == k: p[k] = n k = k + 1 result.append(n) n = n + 1 return result 将其pyrexc编译后得到一个c文件,然后编译之后就是一个python module了~ 按照他 的逻辑,我还对照相应的写了一个Python脚本: #!/usr/bin/env python # primespy.py def primes(kmax): result = [] if kmax > 1000: kmax = 1000 k = 0 n = 2 while k < kmax: i = 0 while i< k and n % result[i] != 0: i += 1 if i == k: result.append(n) k += 1 n+=1 return result 两者的代码行数基本一样,来看一下运行结果: In [23]: tpyx = timeit.Timer(stmt='primes.primes(1000)', setup='import primes') In [24]: tpy = timeit.Timer(stmt='primespy.primes(1000)', setup='import primespy') In [25]: tpyx.timeit(100) Out[25]: 1.2969999313354492 In [26]: tpy.timeit(100) Out[26]: 30.266000032424927 速度提高了30倍之多! pyrex的优势是编写简单,不必处理多余的细节,而且也不需要为这种简单付出效率的 代价。劣势在于目前的pyrex对C++的只是仍然不是很好,还在继续开发之中。至于对 C++到地支持差到什么程度,我还没有进一步测试过,还希望看到各位的高见。 总结是,如果是针对C的Python扩展,或者lib Wrapper,Pyrex可以说是最方便的选 择。如果涉及到C++的扩展,可 能目前boost.python还是最好的选择了。 补:目前正在看Boost.python,SWIG其实并没有细看过,呵呵,只是看了一些intro性 质文章,就开始大发厥词了,希望大家补充指正。 On Wed, 31 May 2006 09:08:14 +0800, 刘鑫 <march.liu at gmail.com> wrote: > Boost和SWIG的Python接口都是对Python API进行的封装。 > > 2006/5/30, CHAOS <chaoszhuo at gmail.com>: >> >> 本人正在学 怎么把C和Python的代码结合起来。有些问题请教一下。 >> >> 我发现有些库 如 >> Boost和SWIG,提供嵌套的功能,同时,Python的文档也有专门的大段叙述。我刚 >> 开始研究。想问问这三者究竟是什么关系?到底什么才是正途? >> >> 谢! >> >> Chaos >> >> _______________________________________________ >> python-chinese >> Post: send python-chinese at lists.python.cn >> Subscribe: send subscribe to python-chinese-request at lists.python.cn >> Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn >> Detail Info: http://python.cn/mailman/listinfo/python-chinese >> >> > > -- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
2006年06月02日 星期五 18:42
Leira Hua 写道: > 倒是这两天我也在看这方面的问题~ > 一般编写Python C/C++ Module,或者为C/C++ lib编写Wrapper,我所看到的有 > 以下几 > 种方式: > 1. 直接使用C Python提供的API > 2. SWIG > 3. Boost.Python > 4. Pyrex > > 首先直接使用Python C API是很不方便的。上面几位高人已经谈过了SWIG和 > Boost.Python,我就不多说了,只是个人感觉易用性而言Boost.Python > SWIG,但 > SWIG功能强大,支持的也只不只是Python一种脚本语言。以上这两种方式对C++ > 的支持 > 都比较友好。 > 这里着重推荐一下Pyrex > (http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/)。 > Pyrex可以说是扩展Python的一大创新,她使用Python like的语法来编写Python的C > Module,自动翻译成C语言代码,进而编译获取C代码的高效率。而且,配合 > Python的 > Distutils,使得构建过程简单到了只需要setup.py的程度。我觉得其简化 > python扩展 > 的编写方式,已经和Boost.python,SWIG不在一个意义级别上了。 > > 这里贴一段来自pyrex的示例,用于搜索质数: > # primes.pyx > # > # Calculate prime numbers > # > > def primes(int kmax): > cdef int n, k, i > cdef int p[1000] > result = [] > if kmax > 1000: > kmax = 1000 > k = 0 > n = 2 > while k < kmax: > i = 0 > while i < k and n % p[i] 0: > i = i + 1 > if i == k: > p[k] = n > k = k + 1 > result.append(n) > n = n + 1 > return result > > 将其pyrexc编译后得到一个c文件,然后编译之后就是一个python module了~ 按 > 照他 > 的逻辑,我还对照相应的写了一个Python脚本: > #!/usr/bin/env python > # primespy.py > > def primes(kmax): > result = [] > if kmax > 1000: > kmax = 1000 > k = 0 > n = 2 > while k < kmax: > i = 0 > while i< k and n % result[i] != 0: > i += 1 > if i == k: > result.append(n) > k += 1 > n+=1 > return result > > 两者的代码行数基本一样,来看一下运行结果: > In [23]: tpyx = timeit.Timer(stmt='primes.primes(1000)', setup='import > primes') > > In [24]: tpy = timeit.Timer(stmt='primespy.primes(1000)', setup='import > primespy') > > In [25]: tpyx.timeit(100) > Out[25]: 1.2969999313354492 > > In [26]: tpy.timeit(100) > Out[26]: 30.266000032424927 > > 速度提高了30倍之多! > > pyrex的优势是编写简单,不必处理多余的细节,而且也不需要为这种简单付出 > 效率的 > 代价。劣势在于目前的pyrex对C++的只是仍然不是很好,还在继续开发之中。至 > 于对 > C++到地支持差到什么程度,我还没有进一步测试过,还希望看到各位的高见。 > > 总结是,如果是针对C的Python扩展,或者lib Wrapper,Pyrex可以说是最方便的选 > 择。如果涉及到C++的扩展,可 > 能目前boost.python还是最好的选择了。 > > 补:目前正在看Boost.python,SWIG其实并没有细看过,呵呵,只是看了一些 > intro性 > 质文章,就开始大发厥词了,希望大家补充指正。 > > > On Wed, 31 May 2006 09:08:14 +0800, 刘鑫 > <march.liu at gmail.com> wrote: > >> Boost和SWIG的Python接口都是对Python API进行的封装。 >> >> 2006/5/30, CHAOS <chaoszhuo at gmail.com>: >>> >>> 本人正在学 怎么把C和Python的代码结合起来。有些问题请教一下。 >>> >>> 我发现有些库 如 >>> Boost和SWIG,提供嵌套的功能,同时,Python的文档也有专门的大段叙述。 >>> 我刚开始研究。想问问这三者究竟是什么关系?到底什么才是正途? >>> >>> 谢! >>> >>> Chaos >>> >>> _______________________________________________ >>> python-chinese >>> Post: send python-chinese at lists.python.cn >>> Subscribe: send subscribe to python-chinese-request at lists.python.cn >>> Unsubscribe: send unsubscribe to >>> python-chinese-request at lists.python.cn >>> Detail Info: http://python.cn/mailman/listinfo/python-chinese >>> >>> >> >> > > > > --Using Opera's revolutionary e-mail client: http://www.opera.com/mail/ > > _______________________________________________ > python-chinese > Post: send python-chinese at lists.python.cn > Subscribe: send subscribe to python-chinese-request at lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request at lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese > Swig绝对是最易用的。
Zeuux © 2025
京ICP备05028076号