#544 GitHub 搜索技巧

2021-06-30

如何快速的、正确的查询资料是开发者的必备技能。GitHub 是一个主要的资料来源,当然需要掌握其用法才行。
除了要知道搜索什么英语术语之外,还有一些别的辅助技能,可以有效的提升 GitHub 搜索效率。

#542 Windows 10 在磁贴中新建快捷方式

2021-06-27

一般安装的软件都可以在开始菜单的 “所有应用” 中看到,选 “固定到开始屏幕” 就行了。

不过,那些 Portable 的绿色软件,如果要放进去怎么弄呢?

  1. 创建快捷方式(我一般直接发送快捷方式到桌面)
  2. 将快捷方式复制到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
    我一般会改个名,比如:qq.exe => QQ
  3. 现在会发现 所有应用 里面出现了新增的那个快捷方式
  4. 然后,就是固定到开始屏幕就行了。

#541 小米路由器局域网不能互通

2021-06-27

同一个 WiFi 内,笔记本和台式机无法 Ping 通。

虽然觉得可能性非常小,但还是关闭防火墙试了一下,果然没用。

最后在路由器上下工夫,经过两天的试验,发现可能和小米路由器有关系。

如果发现连接不上了,切换一下 WiFi 加密方式,似乎就正常。

也可能是断开重启的功劳。

总之,不知道原因。

#540 Python 解释器

2021-06-21

除了 CPython 之外的几种比较知名的 Python 实现:

  1. PyPy
  2. Jython 原名 JPython,原作者停止维护之后,社区将项目改名并继续维护。
  3. IronPython 运行在 .NET 平台
    之前由微软开发(姊妹项目 IronRuby),后来放弃。项目由志愿者维护。
  4. Pyston Dropbox 停止资助该项目,不过还活着,在继续发版。
  5. Unladen Swallow 谷歌的项目,看介绍,思路和 Pyston 差不多(在 pyston 前面),早死翘翘了
  6. Stackless Python: greenlet 就是从这个项目中弄出来的一个成果。
  7. MicroPython: 专门运行在单片机上(有一个 fork 叫 CircuitPython,似乎也有点名气)

#539 常见的 Python 性能提升手段

2021-06-21

Python 本身的性能现在还很有待提升,但是为什么没有阻碍它的推广呢?

因为 Python 常常被当作是一种胶水语言,它有很好的与 C 互操作性,一直维护与 C 库对接的 API,也就是说很容易可以通过 C 拓展来提升性能。

新的运行时

  • PyPy 据说能有很大提升
  • Pyston LLVM 编译器架构 + JIT
    https://github.com/pyston/pyston
    注意:Dropbox 放弃了这个项目,转向 Go 语言,但这个项目还在继续开发中, 比较活跃
  • Psyco http://psyco.sourceforge.net/ 已经没有维护了,据说只维护到 Python 2.4
    官方推荐 PyPy

局部优化

C/C++ 绑定

  • SWIG: C/C++ 写的代码自动绑定到 Python,就是说生成一个 Python 可以调用的 .so 模块
  • pybind11
  • Boost.Python

直接调用 C

直接开发 CPython 拓展模块(include <Python.h>)也可以,但我不觉得这是一个好办法。

GPU

  • GPULib
  • PyStream
  • PyCUDA
  • PyOpenCL

其他

  • F2PY: Fortran to Python, 将 Fortran 代码自动绑定到 Python, NumPy 的一部分
    也是编译成 .so 包
    我不清楚相关应用场景,以及这个方案是否有性能上的优势

参考资料与拓展阅读

#536 Python 源码学习 02: PyObject

2021-06-19

源码

Include/object.h

/* Nothing is actually declared to be a PyObject, but every pointer to
 * a Python object can be cast to a PyObject*.  This is inheritance built
 * by hand.  Similarly every pointer to a variable-size Python object can,
 * in addition, be cast to PyVarObject*.
 */
typedef struct _object {
    _PyObject_HEAD_EXTRA   // 如果开启了 Py_TRACE_REFS 增加一个 _ob_next, _ob_prev
                           // 使 all live heap objects 组成一个双向链表
    Py_ssize_t ob_refcnt;  // 长整型
    PyTypeObject *ob_type;
} PyObject;

/* Cast argument to PyObject* type. */
#define _PyObject_CAST(op) ((PyObject*)(op))
#define _PyObject_CAST_CONST(op) ((const PyObject*)(op))

typedef struct {
    PyObject ob_base;
    Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;

/* Cast argument to PyVarObject* type. */
#define _PyVarObject_CAST(op) ((PyVarObject*)(op))

#define Py_REFCNT(ob)           (_PyObject_CAST(ob)->ob_refcnt)
#define Py_TYPE(ob)             (_PyObject_CAST(ob)->ob_type)
#define Py_SIZE(ob)             (_PyVarObject_CAST(ob)->ob_size)

PyObject

相当于所有 Python 对象的父类,包含类型,引用计数等信息。

注释说的很清楚,不会有直接声明的 PyObject 变量,只会有 PyObject* 指针,所有指向 Python 对象的指针都可以转换成 PyObject*

PyVarObject

表示 ob_size 个 PyObject,也就是说 PyVarObject 是一个 PyObject 的容器。

#535 NumPy 基础

2021-06-18

NumPy 提供了一个高效的数据结构(数组/矩阵)及对应运算支持,据说效率和 C 接近,是 Python 科学计算生态的基础。