扫描二维码,下载安卓APP
下载安卓APP箭头
客服QQ
箭头给我发消息

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

高性能的Python扩展(1)

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

      简介

        通常来说,Python不是一种高性能的语言,在某种意义上,这种说法是真的。但是,随着以Numpy为中心的数学和科学软件包的生态圈的发展,达到合理的性能不会太困难。

        当性能成为问题时,运行时间通常由几个函数决定。用C重写这些函数,通常能极大的提升性能。

        在本系列的第一部分中,我们来看看如何使用NumPy的C API来编写C语言的Python扩展,以改善模型的性能。在以后的文章中,我们将在这里提出我们的解决方案,以进一步提升其性能。

     文件

     这篇文章中所涉及的文件可以在Github上获得。

    模拟

        作为这个练习的起点,我们将在像重力的力的作用下为N体来考虑二维N体的模拟。

        以下是将用于存储我们世界的状态,以及一些临时变量的类。

image.png

        在开始模拟时,N体被随机分配质量m,位置r和速度v。对于每个时间步长,接下来的计算有:

        合力F,每个体上的合力根据所有其他体的计算。

        速度v,由于力的作用每个体的速度被改变。

        位置R,由于速度每个体的位置被改变。

        第一步是计算合力F,这将是我们的瓶颈。由于世界上存在的其他物体,单一物体上的力是所有作用力的总和。这导致复杂度为O(N^2)。速度v和位置r更新的复杂度都是O(N)。

        如果你有兴趣,这篇维基百科的文章介绍了一些可以加快力的计算的近似方法。

     纯Python

        在纯Python中,使用NumPy数组是时间演变函数的一种实现方式,它为优化提供了一个起点,并涉及测试其他实现方式。

image.png

        合力计算的复杂度为O(N^2)的现象被NumPy的数组符号所掩盖。每个数组操作遍历数组元素。

     可视化

        这里是7个物体从随机初始状态开始演化的路径图:

image.png

    性能

       为了实现这个基准,我们在项目目录下创建了一个脚本,包含如下内容:

image.png

        我们使用cProfile模块来测试衡量这个脚本。

image.png

        前几行告诉我们,compute_F确实是我们的瓶颈,它占了超过99%的运行时间。

image.png

在Intel i5台式机上有101体,这种实现能够通过每秒257个时间步长演化世界。

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

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享

版主推荐

    共有1条评论

    • 课课家运营团队
    • Mr ken
    • YUI
    • cappuccino
    • mr jack
    • IT宅男
    • Mright
    • 选择版块:

    • 标题:

    • 内容

    • 验证码:

    • 标题:

    • 内容

    • 选择版块:

    移动帖子x

    移动到: