Skip to main content

用于线性代数的 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.23.3进行测试

  • 多线程友好- 每个 Ceygen 函数都不会获取GIL ,除非它需要创建一个 Python 对象(总是可以避免的);所有函数都声明为nog​​il,以便您可以在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 之上进行并行化,您可能希望从cflagsldflags中删除-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文件或在线查看

在线文档可在http://strohel.github.com/Ceygen-doc/获得

错误

请向Ceygen 的 github 问题跟踪器报告您发现的任何错误和建议。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

Ceygen-0.3.tar.gz (37.2 kB 查看哈希)

已上传 source