3

Python 的 ctypes 模块实在太方便了!

Posted by Elias on 三 24, 2010 in 混乱的IT世界

最近用到中文分词库 Bamboo ,开始时有点头疼居然没有 Python 封装。。后来发现用 ctypes 模块来封装实在是太简单、太方便了~几乎被感动到内流满面~有了庞大 C 库和 ctypes 模块的 Python ,真是可比当年的数理化——走遍天下都不怕~下面给出通过 ctypes 模块调用 Bamboo 分词的示例代码:

?Download seg.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from ctypes import *
 
# 通过 C 接口载入 libbamboo ,“.dylib”是 Mac OSX 下的动态库后缀, Linux 下应该是“libbamboo.so”:
libbamboo = CDLL('libbamboo.dylib')
# 调用 bamboo_init() 函数得到一个分词器实例:
bamboo_init = libbamboo.bamboo_init
bamboo_init.restype = c_void_p
bamboo_handler = bamboo_init(c_char_p('crf_seg'), None)
# 如果返回的实例是 None (也即 C 中的 Null ),表示实例生成失败,那我们打印出错原因:
if bamboo_handler is None:
    bamboo_strerror = libbamboo.bamboo_strerror
    bamboo_strerror.restype = c_char_p
    print bamboo_strerror()
else:
    # 把文本传给分词器准备分词:
    # 待分词的文本必须是 utf-8 编码的 bytes string ,所以我们要把 unicode string encode 一下:
    libbamboo.bamboo_setopt(bamboo_handler, c_long(0), c_char_p(u'我爱北京天安门'.encode('utf-8')))
    # 真正开始分词:
    bamboo_parse = libbamboo.bamboo_parse
    bamboo_parse.restype = c_char_p
    # 下一行得到分词结果(空格分隔),格式还是 utf-8 编码的 bytes string ,我们把它 decode 成 unicode :
    segged = bamboo_parse(bamboo_handler).decode('utf-8')
    print type(segged), len(segged), segged
# 调用 bamboo_clean() 函数释放分词器实例:
libbamboo.bamboo_clean(bamboo_handler)

感谢国家,感谢什么什么TV,另外感谢沈仙人,当年正是他的博文用 Python 写自己的 C Module让 ctypes 在我脑海里留下了不可磨灭的印象^_^

标签:,

 
0

神奇的Stackless Python

Posted by Elias on 十 22, 2008 in 混乱的IT世界

前两天看到沈仙人的Eurasia3,非常惊奇这个Web服务器居然能够提供与直接用C语言实现相近甚至更优的性能,恰好后来又受到一篇老外比较Erlang和Stackless Python并发性能的文章的启发,就进一步用那篇文章里面提到的方法比较了Stackless Python与Python标准线程实现方案之间的并发性能差距,详细的实验过程记录在Wiki上的Python几种并发实现方案的性能比较页面。

实验大致证明在纯并发上的性能,Stackless Python提供的机制要比标准线程实现快上几十倍,并且并发控制模型也相当直观易用。或许这个结果从某个方面向我们解释了Eurasia3能够提供强悍并发性能的原因。

标签:, ,

Elias的邪异门 is proudly powered by WordPress.(京ICP备10013669号 瑞豪开源提供VPS)Theme design by Laptop Geek.
Copyright © 2018 All rights reserved. Entries (RSS) and Comments (RSS).