2.8.8 练习

因为这是一个新部分,练习更像是一个接下来应该查看什么的指示器,因此,看一下那些你觉得更有趣的部分。如果你有关于练习更好点子,请告诉我们!

  • 下载每个例子的源码,并且在你的机器上运行并编译他们。
  • 对每个例子做一些修改,并且自己验证一下是否有效。 ( 比如,将cos改为sin。)
  • 绝大多数例子,特别是包含了Numpy的例子,可能还是比较脆弱,对输入错误反应较差。找一些方法来让例子崩溃,找出问题所在,并且设计潜在的解决方案。这些是有些点子:

    • 数字溢出
    • 输入输出数组长度不一致
    • 多维度数据
    • 空数组
    • non-double类型数组
  • 使用%timeitIPython魔法函数来测量不同解决方案的执行时间

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例子。