<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>生活周遭 &#187; pyrex</title>
	<atom:link href="http://blog.leirahua.com/tag/pyrex/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.leirahua.com</link>
	<description>In My Circle</description>
	<lastBuildDate>Wed, 27 Jan 2010 15:56:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Pyrex, 和Python的C扩展</title>
		<link>http://blog.leirahua.com/2006/pyrex-%e5%92%8cpython%e7%9a%84c%e6%89%a9%e5%b1%95/</link>
		<comments>http://blog.leirahua.com/2006/pyrex-%e5%92%8cpython%e7%9a%84c%e6%89%a9%e5%b1%95/#comments</comments>
		<pubDate>Fri, 02 Jun 2006 04:34:11 +0000</pubDate>
		<dc:creator>leira</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[pyrex]]></category>

		<guid isPermaLink="false">http://blog.leirahua.com/articles/pyrex-%e5%92%8cpython%e7%9a%84c%e6%89%a9%e5%b1%95.html</guid>
		<description><![CDATA[这原本是回复到[python-chinese]邮件列表的，但是没有回复进去，可能是因为功过Gmane news服务器的原因。先转到这儿： 倒是这两天我也在看这方面的问题~ 一般编写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。 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 [...]]]></description>
			<content:encoded><![CDATA[<hr/>
<p>这原本是回复到[python-chinese]邮件列表的，但是没有回复进去，可能是因为功过Gmane news服务器的原因。先转到这儿：</p>
<p>倒是这两天我也在看这方面的问题~<br/><br />
一般编写Python C/C++ Module，或者为C/C++ lib编写Wrapper，我所看到的有以下几种方式：<br />
1. 直接使用C Python提供的API<br />
2. SWIG<br />
3. Boost.Python<br />
4. Pyrex</p>
<p>首先直接使用Python C API是很不方便的。上面几位高人已经谈过了SWIG和Boost.Python，我就不多说了，只是个人感觉易用性而言Boost.Python > SWIG，但SWIG功能强大，支持的也不只是Python一种脚本语言。以上这两种方式对C++的支持都比较友好。</p>
<p>这里着重推荐一下<a href="http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/">Pyrex</a>。<br />
Pyrex可以说是扩展Python的一大创新，她使用Python like的语法来编写Python的C Module，自动翻译成C语言代码，进而编译获取C代码的高效率。而且，配合Python的Distutils，使得构建过程简单到了只需要setup.py的程度。我觉得其简化python扩展的编写方式，已经和Boost.python,SWIG不在一个意义级别上了。</p>
<p>这里贴一段来自pyrex的示例，用于搜索质数：</p>
<pre class="brush: python">
# 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
</pre>
<p>将其pyrexc编译后得到一个c文件，然后编译之后就是一个python module了~ 按照他的逻辑，我还对照相应的写了一个Python脚本：</p>
<pre class="brush: 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
</pre>
<p>两者的代码行数基本一样,来看一下运行结果:</p>
<pre>
In [23]: tpyx = timeit.Timer(stmt=&#39;primes.primes(1000)&#39;, setup=&#39;import primes&#39;)

In [24]: tpy = timeit.Timer(stmt=&#39;primespy.primes(1000)&#39;, setup=&#39;import primespy&#39;)

In [25]: tpyx.timeit(100)
Out[25]: 1.2969999313354492

In [26]: tpy.timeit(100)
Out[26]: 30.266000032424927
</pre>
<p>速度提高了30倍之多！</p>
<p>pyrex的优势是编写简单，不必处理多余的细节，而且也不需要为这种简单付出效率的代价。劣势在于目前的pyrex对C++的只是仍然不是很好，还在继续开发之中。至于对C++到地支持差到什么程度，我还没有进一步测试过，还希望看到各位的高见。</p>
<p>总结是，如果是针对C的Python扩展，或者lib Wrapper，Pyrex可以说是最方便的选择。如果涉及到C++的扩展，可<br />
能目前boost.python还是最好的选择了。</p>
<p>补：目前正在看Boost.python，SWIG其实并没有细看过，呵呵，只是看了一些intro性质文章，就开始大发厥词了，希望大家补充指正。</p>
</p>
</p>
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.leirahua.com/2006/pyrex-%e5%92%8cpython%e7%9a%84c%e6%89%a9%e5%b1%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
