Einsum

爱因斯坦求和约定

矩阵运算中,Einstein summation convention 可以让表达式非常简洁,并且对于我们理解矩阵运算非常有用。一个例子如下

1
2
3
4
5
6
7
A = np.arange(3)
B = np.arange(12).reshape(3, 4)
# Goal: multiply A & B element wise, then sum along axis 1.
# 【 一般矩阵运算如下 】
(A[:, None] * B).sum(axis=1)
# 【 Or using Einstein Summation convention 】
np.einsum('i,ij->i', A, B)

阅读更多

Jupyternotebook 动态加载So/dll文件

如何动态加载?启动一个单独的进程导入so文件。

最近在进行python和C++的混合开发,功能由C++实现,再将C++编译为so文件在jupyter noteboook中进行展示。在jupyter notebookz中涉及到”加载数据”和“加载so文件”。由于so文件改动较频繁,因此整个nb(notebook)经常重跑(终止python进程再重新跑)。但是在nb重跑的时候,数据也会重新加载,这部分耗时较久,成为了开发速度的瓶颈。

为了缩短程序重跑的时间,一个直观的想法是缩短程序数据加载时间。经过分析之后,发现数据加载耗时几乎无法减少。

因此决定采取的方案是重新导入so文件。但是经过查找发现

Python’s import mechanism will never dlclose() a shared library. Once loaded, the library will stay until the process terminates.

链接 a shared library. Once loaded, the library will stay until the process terminates.)

因此在nb的进程中重新导入so文件,几乎无可能。

所以决定绕过在nb中导入so文件,转而该为在nb中启动一个子进程,负责导入so文件、进行有关运算和返回结果。由于每次调用时都会启动一个全新的进程,它能够去导入磁盘最新的so文件,这样就可以在so文件改动之后,在不中断nb的情况下体现so文件的改动。


More Options

  1. code不单独拎出去,全部卸载nb中
    1. 这是可行的,process以spawn启动就行
  2. 自定义python中Import机制
    1. 参考importlib

Python-Mro方法解析顺序

MRO(method resolution order, 方法解析顺序)是类继承中的一个问题。由于类可能继承多个基类,那么当触发多态时就面临这一个问题:从哪个基类里面去找方法?换句话说,类的遍历(解析)顺序是什么?

当只有一个基类时这个问题很简单,因此一般讨论的是多个基类的解析顺序。

阅读更多