2.8.8 练习
因为这是一个新部分,练习更像是一个接下来应该查看什么的指示器,因此,看一下那些你觉得更有趣的部分。如果你有关于练习更好点子,请告诉我们!
- 下载每个例子的源码,并且在你的机器上运行并编译他们。
- 对每个例子做一些修改,并且自己验证一下是否有效。 ( 比如,将cos改为sin。)
绝大多数例子,特别是包含了Numpy的例子,可能还是比较脆弱,对输入错误反应较差。找一些方法来让例子崩溃,找出问题所在,并且设计潜在的解决方案。这些是有些点子:
- 数字溢出
- 输入输出数组长度不一致
- 多维度数据
- 空数组
- non-double类型数组
- 使用
%timeit
IPython魔法函数来测量不同解决方案的执行时间
2.8.8.1 Python-C-API
- 修改Numpy例子以便函数有两个输入参数,第二个参数是预分配输出数组,让它与其他的Numpy例子一致。
- 修改这个例子,以便这个函数只有一个输入数组,在原地修改这个函数。
- 试着用新的Numpy迭代协议修改例子。如果你刚好获得了一个可用的解决方案,请将其提交一个请求到github。
- 你可能注意到了,Numpy-C-API例子只是Numpy例子没有封装
cos_doubles
但是直接将cos
函数应用于Numpy数组的元素上。这样做与其他技术相比有什么优势。 - 你可以只用Numpy-C-API来封装
cos_doubles
。你可能需要确保数组有正确的类型,并且是单维度和内存临近。
2.8.8.2 Ctypes
- 修改Numpy例子以便
cos_doubles_func
为你处理预分配,让它更像Numpy-C-API例子。
2.8.8.3. SWIG
- 看一下SWIG自动生成的代码,你能理解多少?
- 修改Numpy例子,以便
cos_doubles_func
为你处理预处理,让它更像Numpy-C-API例子。 - 修改
cos_doubles
C 函数,以便它返回分配的数组。你可以用SWIG typemaps类封装吗? 如果不可以,为什么不可以? 对于这种特殊的情况有没有什么变通方法? (提示: 你知道输出数组的大小, 因此,可以从返回的double *
构建Numpy数组。
2.8.8.4 Cython
- 看一下Cython自动生成的代码。仔细看一下Cython插入的一些评论。你能看到些什么?
- 看一下Cython文档中与Numpy工作的部分, 学习一下如何使用Numpy增量优化python脚本。
- 修改Numpy例子,以便
cos_doubles_func
为你处理预处理,让它更像Numpy-C-API例子。