下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922
论坛 >编程语言 >高性能的Python扩展(2)

高性能的Python扩展(2)

希尔瓦娜斯发布于 2017-09-29 11:35查看:960回复:1

     简单的C扩展 1

        在本节中,我们将看到一个C扩展模块实现演化的功能。当看完这一节时,这可能帮助我们获得一个C文件的副本。文件src/simple1.c,可以在GitHub上获得。

        关于NumPy的C API的其他文档,请参阅NumPy的参考。Python的C API的详细文档在这里。

      样板

        文件中的第一件事情是先声明演化函数。这将直接用于下面的方法列表。

image.png

        接下来是方法列表。

image.png


        这是为扩展模块的一个导出方法列表。这只有一个名为evolve方法。

        样板的最后一部分是模块的初始化。

image.png

        另外,正如这里显示,initsimple1中的名称必须与Py_InitModule中的第一个参数匹配。对每个使用NumPy API的扩展而言,调用import_array是有必要的。

      数组访问宏

        数组访问的宏可以在数组中被用来正确地索引,无论数组被如何重塑或分片。这些宏也使用如下的代码使它们有更高的可读性。

image.png

        在这里,我们看到访问宏的一维和二维数组。具有更高维度的数组可以以类似的方式被访问。

        在这些宏的帮助下,我们可以使用下面的代码循环r:

image.png


      命名标记

        上面定义的宏,只在匹配NumPy的数组对象定义了正确的名称时才有效。在上面的代码中,数组被命名为py_mpy_r。为了在不同的方法中使用相同的宏,NumPy数组的名称需要保持一致。

      计算力

        特别是与上面五行的Python代码相比,计算力数组的方法显得颇为繁琐。

image.png


        请注意,我们使用牛顿第三定律(成对出现的力大小相等且方向相反)来降低内环范围。不幸的是,它的复杂度仍然为O(N^2)。

      演化函数

        该文件中的最后一个函数是导出的演化方法。

image.png

        在这里,我们看到了Python参数如何被解析。在该函数底部的时间步长循环中,我们看到的速度和位置向量的x和y分量的显式计算。

     性能

        C版本的演化方法比Python版本更快,这应该不足为奇。在上面提到的相同的i5台式机中,C实现的演化方法能够实现每秒17972个时间步长。相比Python实现,这方面有70倍的提升。

      观察

        注意,C代码一直保持尽可能的简单。输入参数和输出矩阵可以进行类型检查,并分配一个Python装饰器函数。删除分配,不仅能加快处理,而且消除了由Python对象不正确的引用计数造成的内存泄露(或更糟)。

      下一部分

        在本系列文章的下一部分,我们将通过发挥C-相邻NumPy矩阵的优势来提升这种实现的性能。之后,我们来看看使用英特尔的SIMD指令和OpenMP来进一步推进。

收藏(0)0
查看评分情况

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享

版主推荐

    共有1条评论

    • IT宅男
    • mr jack
    • Mr ken
    • Mright
    • cappuccino
    • YUI
    • 课课家运营团队
    • 课课家技术团队1
    • 酸酸~甜甜
    • 选择版块:

    • 标题:

    • 内容

    • 验证码:

    • 标题:

    • 内容

    • 选择版块:

    移动帖子x

    移动到: