我长期使用Fortran进行计算物理相关工作,最近开始学习并尝试使用Python。我知道作为一种解释性语言,对于主要依赖CPU的计算工作,Python通常比Fortran慢。但我认为使用numpy会显著提高简单任务如排序的性能。
所以我的测试案例是使用冒泡排序(只是一个包含许多数组操作的测试案例,因此不需要评论算法本身的性能)来对包含10000个随机浮点数的数组/列表进行排序。我的计时结果如下(所有函数使用相同的算法):
Python3(使用numpy数组,但使用我的自己的函数而不是numpy.sort):33.115秒
Python3(使用列表):9.927秒
Fortran(gfortran):0.291秒
Python3(使用numpy.sort):0.269秒(不公平的比较,因为它使用不同的算法)
我惊讶地发现,与Python列表相比,使用numpy数组的操作速度要慢约3倍,与Fortran相比慢了约100倍。所以在这一点上,我的问题是:
- 为什么在这个测试案例中,使用numpy数组操作明显比Python列表更慢?
- 如果我需要的算法还没有在scipy/numpy中实现,并且我需要在Python框架内编写自己的函数以获得最佳性能,我应该使用哪种数据类型操作:numpy数组或列表?
- 如果我的应用程序是面向性能的,并且我想编写与内置numpy函数(如np.sort)等效的函数,我应该学习/使用哪些工具/框架?