这篇文章主要整理对同一个任务,不同的算法导致的速度的差别,不定期更新的,当然也会顺便扯扯淡。
昨日有同事认为我写的Center_Rank函数比MD的Rank函数要慢,这个问题我今天测试了一下。
关于列表解析,for循环,迭代器,map函数的速度测试比较:
返回的y_map和y_generator是迭代器,转换过程也很花时间。
既然这样我就只能使用终极大杀招:numba。
之前看到某top1学校量化协会会长在朋友圈晒出在wall street面试的题目,请看面试题第五题。多数人以为面试者在侮辱智商,实际上我猜题目的原本意义应该是想考察面试者,为什么要写这些函数,或者说这些函数在哪些情况下是非要这么写不可。原题应该是纯英文,这些题应该是作者自己翻译的。
很明显,如果翻译原英文题目内容没有缺省的话,第五题的难度跟前面几个题目的难度根本不在一个level上,但如果第五题如果问的是为什么要像C一样写python的话,这个题目的level就跟前几个题目一致了,我这里举例如下:
之前Yuze He同学问我pandas里面有没有类似于corrwith(计算两个形状相同的矩阵的对应行的相关系数)的,但计算的是方差的函数。
似乎没有找到这样的ufunc(universal function,一般比自定义的函数快很多),如果有人知道这种函数,麻烦告诉我。
所以我就为此问题写了一堆方法,其中有
0.for循环;
1.for循环加zip;
2.列表解析(list comprehension);
3.迭代器(generator);
4.map函数;
5.利用ufunc中的corrwith算相关系数,std算标准差,然后相乘;
6.保留numpy的向量运算风格用numba的jit(即时编译技术);
7.像C一样写python,同时使用numba的jit;
来看速度吧:
输出结果如下:
1.可以看到所有方法的计算结果都一样,也就是都完成了任务;
2.最快的是像C一样写python,丝毫不怕写for循环,但要使用numba.jit加速;这也就回答了面试题中为什么要那样写python了,因为对于使用numba.jit加速的代码,使用python的built-in的函数和类应该是最好的,而应当尽量不使用第三方库。
3. 而numba和C++谁更厉害,结论是numba跟优化过的C++一样厉害。原文链接如下:比较Python,Numpy,Numba和C ++进行矩阵乘法 - IT屋-程序员软件开发技术分享社区www.it1352.com
pickle文件的读和写比csv要快很多,这里特地引用一下Edward Fu:问题五、各种OI的效率快慢问题?
1. npy读写效率最高,但最费硬盘空间,比如np.load(), np.save();
2. csv其次,比如pd.Dataframe.to_csv(),pd.load_csv();
3. txt读写,当然也可以很快,但是需要频繁的split,对格式规范的数据比较麻烦;
4. 至于简单的excel和word,可以用xlrd,xlwt来操作
作者:Edward.Fu
链接:https://zhuanlan.zhihu.com/p/21337237