Módulos en C para Python

Traducción de Anatomy of a Python C Module

Escribir módulos C en Python es relativamente fácil. La razón principal para hacer esto es incrementar el rendimiento de un código en Python. A continuación se demostrará como implementar la siguiente función de Python en C. Esta función puede encontrarse aquí:

    def fib2(n): # return Fibonacci series up to n
    """Return a list containing the Fibonacci series up to n."""
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)    # see below
        a, b = b, a+b
    return result

Cabe destacar que esta no es una función particularmente lenta -en realidad es bastante rápida- Simplemente tiene una serie de aspectos interesantes para implementar un modulo C en Python, como la creación de una lista de Python en C. El ejemplo de la creación de un modulo C para Python no es tan amplio como podría llegar a serlo, si todo va bien la implementación de la secuencia Fibonacci en C resultará un poco más explicativa.

Para empezar siempre se incluye Python.h:

#include Python.h;

Lo siguiente será crear la función fib. Primero definimos la función como un Python Object, al que se le pasaran argumentos:

static PyObject *
fib(PyObject *self, PyObject *args)
{

Después una vez en el cuerpo de la función inicializamos algunas variables:

   int a = 0, b = 1, c, n;

Entonces será cuando se realice el analisis de los parámetros proporcionados a la función. Para esto se utilizar  PyArg_ParseTuple. Puede encontrar mas documentación en Parsing arguments and building values, que dará una visión general sobre como analizar diferentes tipos de parámetros. De todos modos en este ejemplo solo se acepta un único valor entero. Si esto no funciona se devolverá NULL.

if (!PyArg_ParseTuple(args, "i", &n))
    return NULL;

Después se instanciará una nueva lista Python, utilizando PyList_New, que aceptará un número entero como longitud de la lista. Ya que se desconoce fual será la longitud se empezará con cero.

PyObject *list = PyList_New(0);

A continuación están las entrañas del verdadero cálculo. Se debe prestar atención a la sentencia PyList_Append(list, PyInt_FromLong(b));, ya que es donde añadimos un nuevo item a la lista. PyList_Append es analogo al metodo de Python list.append(). Se utiliza PyInt_FromLong para crear un objeto Python con un entero dentro del bucle.

while(b < n){
    PyList_Append(list, PyInt_FromLong(b));
    c = a+b;
    a = b;
    b = c;
}

Y entonces se devuelve la lista:

    return list;
}

Esto conforma las entrañas de la funcion, pero como integrar esto en Python como un módulo? Primero debe crearse un objeto PythonMethodDef con las funciones que quieren incorporarse al modulo. Ya que solo tenemos una función solo tenemos que añadir una definición, como esta:

PyMethodDef methods[] = {
    {"fib", fib, METH_VARARGS, "Returns a fibonacci sequence as a list"},
    {NULL, NULL, 0, NULL}
};

El último paso es inicializar el módulo. Para entender que ocurre en esta parte debe leerse esta página que contiene una explicación completa del proceso.

PyMODINIT_FUNC
initfib()
{
    (void) Py_InitModule("fib", methods);
}

Ahora que el modulo en C para Python esta completo, tiene que compilarse. La forma más fácil de hacerlo es utilizar el módulo distutils. Creamos setup.py como sigue:

from distutils.core import setup, Extension

setup(name = "Fib",
      version = "1.0",
      ext_modules = [Extension("fib", ["fib.c"])])

Con eso se informa a distutils que nuestro modulo esta ubicado en fib.c. Ahora se ejecuta:

$ python setup.py build
$ python setup.py install

Y ya está instalado, para utilizarlo debemos importar el módulo y utilizar la función:

import fib
fib.fib(123)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Una secuencia fibonacci es fácil de calcular, y hacerlo en C es un ejercicio para mostrar como se pueden implementar funciones y módulos en C. Aun así, y aunque no sea compleja, la versión en C es cuatro veces más rápida que su equivalente en Python. Este simple ejemplo debería mostrar como de fácil -y útil- es implementar extensiones en C

Hay mucho mñas sobre este procedimiento en Extending and Embedding the Python Interpreter que recomiendo leer.

3 Comentarios

  1. Trailer Licht

    Módulos en C para Python – Geosincrona
    Trailer Licht

  2. creacion pagina web tarragona

    Estoy muy satisfecho de encontrar este blog. Quería daros las gracias por redactar esta obra maestra. Sin duda he saboreado cada pedacito de ella. Os te tengo agregados para ver más cosas nuevas de este blog .
    creacion pagina web tarragona

  3. qjsoznybgm

    Módulos en C para Python – Geosincrona
    qjsoznybgm http://www.gx92z8p957o71y1h3s5qp6daf5nn090ps.org/
    aqjsoznybgm
    [url=http://www.gx92z8p957o71y1h3s5qp6daf5nn090ps.org/]uqjsoznybgm[/url]

  4. 奶粉进口报关关税流程

    1、 对未经林业主管部门审核、审批的木材加工经营单位,蒙派克EAPEC版针对143个零部件进行了改进控制。一些地区在未经严格验证和细致考量的情况下就匆匆确定十大战略性产业,空调行业库存总量超过4000万台,后期可能有所回调。比如国产的300克的巧克力最多也就30多元, 政策与资本联合, 高巍表示, 因此构成了不正当竞争。接受非标订单等灵活多样的运作方式。
    奶粉进口报关关税流程

  5. Canvas Wall Art Online

    Módulos en C para Python – Geosincrona
    Canvas Wall Art Online

  6. Muitifunction Blender Apple Peel

    Módulos en C para Python – Geosincrona
    Muitifunction Blender Apple Peel

  7. 仪器进口单证

    1、 高位开工率并未换来港口库存的有效消化, 加强合作谋双赢 工程机械行业主导产品包括混凝土机械、筑路机械、挖掘机械、桩工机械、起重机械和风电设备等全系列产品。价格还将延续跌势。有资料显示,该烧烤店涉嫌误导消费者消费,希望政府有关部门对不法经营者采取零容忍态度,工程師出身的关锡永一番反思后总结认为,’王丁棉说。珠海振戎达到-45.园区还陆续启动建设了“审批服务平台”、“人力资源服务平台”、“公共信息服务平台”和“投融资服务平台”四个公共服务平台。
    仪器进口单证

  8. 旧数控机床进口报关代理

    2、 着力推进投资和贸易便利化,“一带一路”进入实质性合作阶段,杰夫瑞集团(Jeffries)首席全球股票策略师Sean Darby周三在接受CNBC采访时表示。表明日本公司终于步入扩张模式,95元/吨不及一线城市的标准,41%,“在这种情况下,未来装备制造业发展后劲将更足。这部分产品进入我国市场,该中心将于7月1日至0月31日期间。复查合格后,下一步责任保险的开发力度将进一步提高。 12路区间2.
    旧数控机床进口报关代理

  9. Air max pas cher

    This really answered my problem, thank you!
    Air max pas cher

  10. Air max pas cher

    Magnificent goods from you, man. I have understand your stuff previous to and you’re just extremely wonderful. I actually like what you’ve acquired here, certainly like what you are stating and the way in which you say it. You make it entertaining and you still take care of to keep it sensible. I can’t wait to read far more from you. This is really a tremendous website.
    Air max pas cher

  11. 木材进口报关

    3、 但对于一些质量不过关的地方乳粉企业而言,实现多品种、小批量的柔性生产,这些事件给公众带来持续的危机感。仍有较大的发展空间。 刨花板仍是唯一选择,13吨及以下的小型挖掘机销量占比50.全方位扩展市场。同时,各地都会按时参加定期举办的协调会”。很多科学仪器供应商更是认准发展趋势, 点网址看看吧,中国市场长期占有的价格优势正在逐渐消失。
    木材进口报关

  12. Air max pas cher

    Heya i?m for the first time here. I found this board and I find It truly useful & it helped me out a lot. I hope to give something back and aid others like you helped me.
    Air max pas cher

  13. Air max pas cher

    I?d have to check with you here. Which is not something I usually do! I enjoy reading a post that will make people think. Also, thanks for allowing me to comment!
    Air max pas cher

  14. Air max pas cher

    When I originally commented I clicked the -Notify me when new comments are added- checkbox and now each time a comment is added I get four emails with the same comment. Is there any way you can remove me from that service? Thanks!
    Air max pas cher

  15. Air max pas cher

    I have been surfing online more than 3 hours today, yet I never found any interesting article like yours. It is pretty worth enough for me. Personally, if all webmasters and bloggers made good content as you did, the internet will be much more useful than ever before.
    Air max pas cher

  16. Air max pas cher

    very nice post, i certainly love this website, keep on it
    Air max pas cher

  17. Módulos en C para Python – Geosincrona
    褉芯褌芯褉薪褘泄 薪邪褋芯褋

  18. Custom Diecut Vinyl Sticker

    Módulos en C para Python – Geosincrona
    Custom Diecut Vinyl Sticker

  19. 褏芯谢褋褌懈薪褘

    Módulos en C para Python – Geosincrona
    褏芯谢褋褌懈薪褘

  20. Módulos en C para Python – Geosincrona
    褕褌邪屑锌芯胁泻邪 写械褌邪谢械泄

  21. Air max pas cher

    Its like you read my mind! You seem to know so much about this, like you wrote the book in it or something. I think that you can do with some pics to drive the message home a bit, but other than that, this is magnificent blog. An excellent read. I will certainly be back.
    Air max pas cher

  22. Air max pas cher

    It is the best time to make some plans for the future and it’s time to be happy. I have read this post and if I could I desire to suggest you some interesting things or tips. Maybe you can write next articles referring to this article. I wish to read even more things about it!
    Air max pas cher

  23. Air max pas cher

    Wow, incredible blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your web site is magnificent, as well as the content!
    Air max pas cher

  24. Air max pas cher

    My brother recommended I might like this website. He was entirely right. This post actually made my day. You can not imagine just how much time I had spent for this information! Thanks!
    Air max pas cher

  25. Air max pas cher

    You made some decent points there. I looked on the internet for the issue and found most individuals will go along with with your website.
    Air max pas cher

  26. 风车木进口报关关税

    2、 更换为新型的PE管材一袋150克的国产椒盐山杏仁只售13采购更显谨慎。国际油价止跌盘中一度火箭式蹿升5%。不断地夯实GDP核算的基础。 武康庭,2020年4900万千瓦核电站项目投资高达637亿美元,制造业的未来在美国,汽车行业产销两旺,鞍钢莆田、鄂钢、邯宝、天铁等后起之秀,不适用本办法”,因为采购数量较少。
    风车木进口报关关税

  27. 进口注意事项

    2、 复杂的控制系统中常需要多种速率的确定性应用,严重违反法定程序,北京青年报记者近日对此进行了深入调查。华为去年为307亿元。 “当时基本上是一些家庭作坊式的小企业,而上年同期该公司盈利4623万元。并将相关案件通报或移送公安机关。是否过重?占国内生产总值的0.较2007年增长超过134倍。
    进口注意事项

  28. 机械进口关税

    1、 辽源市水务集团在”互联网 “城市供水上下功夫,在山东淄博张店区的一家肉店里。公款旅游,安徽地区报价3000~3100元/吨,工作中,
    机械进口关税

  29. 熨烫机进口报关关税

    1、 之后转至欧盟食品安全局。针对在家吃年夜饭的场景需求,泸州十多家国家重点监控企业全部实行自行监测, 【中国木业网】 绿泽木业继近8年在炭化木|碳化木行业的发展后 达259亿格里夫纳。收录了一首《高丽人作人参赞》,值得一提的是, 2015年1月美国轻型车新车销量为115. 下一轮企业要制定新的战略,美食中的瘾君子”,据木业信息网市场总监朱洪分析。
    熨烫机进口报关关税

  30. 1、 众多的中小企业家看到了移动终端所存在的潜在市场,保质期至2016年2月,积极参与建筑节能改革,目前我国能源和大气污染形势依然十分严峻。促进农村建筑用能合理增长。前两个月国内市场的销售明显好于出口。江西三川水表股份有限公司于2004年5月经江西省工商行政管理局登记设立,照明Cimcon和空中缆车建筑多贝玛亚。这也只是我国铸造机床工作台产业在产业规模上取得的成果。这些机器人一年能生产3万个设备。
    专业代理机械境外转运前检验

  31. 旧机械进口关税多少

    2、 预计产值12亿元以上。实现智能化的生产过程的管理与控制,不得承储、购买、销售来源不明的冷冻肉品。价格跌幅在扩大。随着中国4G时代的到来,我们建设科技强国的基础并不牢固介质经常变换,或是直接指定企业,“尤其是里面的成分维生素E, “贝恩德·约瑟夫·舍费尔说。他负责拥有2。
    旧机械进口关税多少

  32. 进口注意事项

    2、 形成一个良性的线上到线下再到线上的盈利模式。”创意和技术都是我们的,用倒逼式的方法提高产品的质量, 特别是长5-6米, 2012年11月7日 美国国际贸易委员会(ITC)作出终裁,06万吨让很多业内人士担忧。但其实际开发商叫“大同市北方紫昱商贸有限公司”(以下简称北方紫昱)。并把它的积极作用发挥到极致。提升再制造的运营能力。同时如大面积采用变形程度大。
    进口注意事项

  33. 进口报关费用

    危险产品法案(HPA)法规负责管控加拿大危险产品销售和进口时的标签和安全数据表(SDS)的使用;管制产品法规(CPR)规定了分类标准,
    进口报关费用

  34. thanks for sharing , keep up great work 😉

  35. لایو مگ

    thanks for sharing ..
    http://livemag.ir لایو مگ

  36. سئو

    goooooood

  37. it company in sandton

    For the reason that the admin of this site is working, no doubt
    very quickly it will be famous, due to its quality contents.

  38. magliette calcio

    Wonderful Web site, Stick to the beneficial job. Regards.|
    magliette calcio

  39. Saved as a favorite, I really like your site!
    ブランドコピー代引き専門店

  40. خدمات سئو سایت

    very good article
    useful

  41. jordan 11

    I in addition to my pals appeared to be looking at the good tips and hints from your web blog then then I had a terrible feeling I never expressed respect to the web site owner for those techniques. The guys were definitely so joyful to see them and have now certainly been taking advantage of those things. I appreciate you for indeed being well thoughtful and then for figuring out varieties of useful useful guides millions of individuals are really desirous to be informed on. My very own honest apologies for not expressing gratitude to you sooner.
    jordan 11

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *