用于线性代数的 Cython 助手,在 Eigen C++ 库之上构建了类型化的内存视图
项目描述
关于
Ceygen 是用于线性代数的二进制 Python 扩展模块,具有Cython 类型的 memoryviews。Ceygen 构建在Eigen C++ 库之上。Ceygen不是Cython 包装器或 Eigen 的接口!
Ceygen 这个名字在 Cython + Eigen 上是一个相当糟糕的文字游戏;它与软件盗版无关。Ceygen 目前在 GNU GPL v2+ 许可下分发。然而,Ceygen 的作者对其他许可建议持开放态度。(你想在例如 BSD 许可的项目中使用 Ceygen 吗?问!)
Cython 由 Matěj Laitl在捷克共和国科学院信息理论与自动化研究所的支持下开发。请随时给我发邮件给 laitl dot cz 的 matej。
特征
赛根…
速度快- Ceygen 的主要存在理由是为使用类型化内存视图(尤其是小型)的Cython项目提供无开销的代数运算。对于每个函数,都有一个代码路径,其中没有调用 Python 函数,没有在堆上分配内存,也没有数据被复制。 Eigen 本身的表现也相当不错。
支持各种数据类型- Ceygen 使用 Cython融合类型(又名崇拜模板)以及 Eigen 的模板性质来支持各种数据类型而无需重复代码。虽然只有少数类型是预定义的(float、double 等),但添加新类型只需添加 3 行并重新构建 Ceygen。
经过广泛测试- Ceygen 的测试套件验证其每个公共方法,包括无效输入引发的错误。感谢 Travis CI,每次推送都会自动针对Python 2.6、2.7、3.2和3.3进行测试。
多线程友好- 每个 Ceygen 函数都不会获取GIL ,除非它需要创建一个 Python 对象(总是可以避免的);所有函数都声明为nogil,以便您可以在prange块中调用它们而不会失去并行性。
提供描述性错误消息- 注意正确传播所有错误(从 Eigen 向下),这样您就不会被困在调试程序中。Ceygen 函数不会因无效输入而崩溃,而是会引发合理的错误。
与NumPy配合得很好,但不依赖于它。您不需要 NumPy 来构建或运行 Ceygen,但是由于 Cython,Cython 内存视图和 NumPy 数组可以完全互换,而无需复制数据(在可能的情况下)。由于我们的懒惰,测试套件目前使用 NumPy。:-)
另一方面,赛根...
取决于 Eigen build-time。Ceygen 期望Eigen 3头文件在构建时安装在 /usr/lib/eigen3下。安装 Eigen 就是解压它,因为它是一个纯模板库,仅在标头中定义。Ceygen 在运行时根本不引用 Eigen,因为所有代码都被编译了。
仍然提供很少的 Eigen 功能子集。我们仅在其他项目中需要它们时添加新功能,但我们认为困难的部分是基础设施 - 实现新功能应该相当简单(具有良好的 Cython 和 C++ 知识)。我们非常愿意接受拉取请求!(在其中包含单元测试)
需要最近的 Cython(目前至少 0.19.1)来编译。如果这是一个问题,您可以分发 .cpp 文件或最终的 Python 扩展模块。
没有给 Cython 带来 Eigen 的优雅——如果你想到懒惰的评估和高级表达,别再做梦了。Ceygen 将使您的代码更快,而不是更好。 数组表达式将在这里有所帮助。
在大矩阵中计算矩阵乘积的简单示例可能如下所示
>>> cdef double[:, :] big = np.array([[1., 2., 2., 0., 0., 0.], >>> [3., 4., 0., -2., 0., 0.]]) >>> ceygen.core.dot_mm(big[:, 0:2], big[:, 2:4], big[:, 4:6]) [[ 2. -4.] [ 6. -8.]] >>> big [[ 1. 2. 2. 0. 2. -4.] [ 3. 4. 0. -2. 6. -8.]],
上面的dot_mm调用不会复制任何数据,不会在堆上分配内存,不需要GIL并使用矢量化(SSE、AltiVec…)来充分利用处理器。
获得
Ceygen 开发发生在它的 github 存储库中,git clone git@github.com:strohel/Ceygen.git -ing 是获得它的首选方式,因为您将拥有最新和最好的版本(由于持续集成,它不应该中断)。已发布的版本可从Ceygen 的 PyPI 页面获得。
建造
Ceygen 使用标准的 Distutils 来构建、测试和安装自己,只需运行:
python setup.py build构建 Ceygen
python setup.py test测试它(在构建目录中)
python setup.py install安装它
python setup.py clean清理生成的对象、.cpp 和 .html 文件(可能强制重新编译)
命令可以组合,自动调用依赖命令并且可以采取选项,因此推荐的安全安装 Ceygen 的组合是python setup.py -v test install。
建筑选项
您可以像使用 distutils 一样设置各种构建选项,请参阅 python setup.py --help。值得注意的是build_ext命令及其–include-dirs (标准)和以下附加选项(它们是 Ceygen 扩展):
- --include-dirs
默认为/usr/include/eigen3如果您已将 Eigen 3 安装到非标准目录,则必须指定,
- --cflags
默认为-O2 -march=native -fopenmp。请注意,启用优化和生成适当的 MMX/SSE/altivec 启用代码非常重要,因为来自 Eigen 的实际计算代码是与样板 Ceygen 代码一起构建的,
- --ldflags
要传递给链接器的附加标志,默认为-fopenmp。使用标准–libraries 指定要链接的额外库,
- --annotate
将–annotate传递给 Cython 以在编译期间生成带注释的 HTML 文件。仅在 Ceygen 开发期间有用。
如果您已经在 Ceygen 之上进行并行化,您可能希望从cflags和ldflags中删除-fopenmp 。生成的命令可能类似于python setup.py -v build_ext --include -dirs=/usr/local/include/eigen3 --cflags="-O3 -march=core2" --ldflags= test。通过将选项放入setup.cfg文件可以实现相同的目的:
[build_ext] include_dirs = /usr/local/include/eigen3 cflags = -O3 -march=core2 ldflags =
文档
Ceygen 文档在doc/目录下以reStructuredText格式维护,可以使用Sphinx导出为各种格式(至少需要 1.0 版本)。只需在该目录中键入make即可查看支持的格式列表,例如 make html以使用文档构建 HTML 页面。
有关版本之间的更改,请参见ChangeLog.rst文件或在线查看。
错误
请向Ceygen 的 github 问题跟踪器报告您发现的任何错误和建议。