很长时间以来,我一直在使用Fortran进行与计算物理有关的工作,最近开始学习和使用Python。我知道以下事实:作为主要用于CPU密集型计算工作的Python,其解释语言通常比Fortran慢。但是后来我认为使用numpy可以显着提高排序等简单任务的性能。
因此,我的测试用例是使用冒泡排序对一个数组/包含随机浮点数的大小为10,000的列表进行排序(只是一个具有许多数组操作的测试用例,因此无需评论算法本身的性能)。我的计时结果如下(所有函数使用相同的算法):
Python3(使用numpy数组,但使用我自己的函数代替numpy.sort):33.115s
Python3(使用列表):9.927s
Fortran(gfortran):0.291秒
Python3(使用numpy.sort):0.269秒(不公平的比较,因为它使用了不同的算法)
令我惊讶的是,使用numpy数组进行操作的速度比使用python list慢约3倍,比使用Fortran慢约100倍。因此,我的问题是:
- 在此测试用例中,为什么使用numpy数组运行比python列表慢得多?
- 如果我需要的算法尚未在scipy / numpy中实现,并且我需要在Python框架内编写自己的函数,并且考虑到最佳性能,那么我应该使用哪种数据类型:numpy数组或列表?
- 如果我的应用程序以性能为导向,并且我想编写与内置numpy函数(例如np.sort)具有相同性能的函数,那么我应该学习/使用哪些工具/框架?