Python论坛  - 讨论区

标题:[python-chinese] Boost, Swig 和 Python相关官方文档

2006年06月01日 星期四 10:55

Leira Hua lhua at altigen.com.cn
Thu Jun 1 10:55:12 HKT 2006

倒是这两天我也在看这方面的问题~
一般编写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/


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年06月02日 星期五 09:19

Wenjie He lazycoding at gmail.com
Fri Jun 2 09:19:27 HKT 2006

谢谢你
看来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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年06月02日 星期五 09:26

刘鑫 march.liu at gmail.com
Fri Jun 2 09:26:42 HKT 2006

从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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年06月05日 星期一 10:41

Leira Hua lhua at altigen.com.cn
Mon Jun 5 10:41:38 HKT 2006

真是不好意思,同一封信发了好几次。因为通过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/


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号