2006年06月01日 星期四 10:55
倒是这两天我也在看这方面的问题~ 一般编写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日 星期五 09:19
谢谢你 看来pyrex值得尝试 On 6/1/06, Leira Hua <lhua at altigen.com.cn> wrote: > 倒是这两天我也在看这方面的问题~ > 一般编写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 > -- I'm lazy, I'm coding. http://lazy.bloggoing.com
2006年06月02日 星期五 09:26
从Python程序员的角度,Pyrex提供了一个最大优化程序效率的可能途径。从C++程序员的角度来看,Boost可能更适合。这个类库不止包含Python接口,更有完整的工具库,例如MPL、仿函数、字符串操作、容器、数学算法、正则表达式等等。基本上Boost+STL,可以解决绝大多数的基础功能需求。 2006/6/2, Wenjie He <lazycoding at gmail.com>: > > 谢谢你 > 看来pyrex值得尝试 > > On 6/1/06, Leira Hua <lhua at altigen.com.cn> wrote: > > 倒是这两天我也在看这方面的问题~ > > 一般编写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 > > > > > -- > I'm lazy, I'm coding. > http://lazy.bloggoing.com > > _______________________________________________ > 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 > > -- 欢迎访问: http://blog.csdn.net/ccat 刘鑫 March.Liu -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060602/1eb716fc/attachment-0001.htm
2006年06月05日 星期一 10:41
真是不好意思,同一封信发了好几次。因为通过Gmane news服务器发的,很长时间不 知道有没有真的发到。 既然刘兄对boost.python有研究,我现在恰好刚开始看,以后就多请教了。 On Fri, 02 Jun 2006 09:26:42 +0800, 刘鑫 <march.liu at gmail.com> wrote: > 从Python程序员的角度,Pyrex提供了一个最大优化程序效率的可能途径。从C++程 > 序员的角度来看,Boost可能更适合。这个类库不止包含Python接口,更有完整的工 > 具库,例如MPL、仿函数、字符串操作、容器、数学算法、正则表达式等等。基本上 > Boost+STL,可以解决绝大多数的基础功能需求。 > > 2006/6/2, Wenjie He <lazycoding at gmail.com>: >> >> 谢谢你 >> 看来pyrex值得尝试 >> >> On 6/1/06, Leira Hua <lhua at altigen.com.cn> wrote: >> > 倒是这两天我也在看这方面的问题~ >> > 一般编写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 >> > >> >> >> -- >> I'm lazy, I'm coding. >> http://lazy.bloggoing.com >> >> _______________________________________________ >> 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/
Zeuux © 2025
京ICP备05028076号