帮助优化python扩展编译的库。

compilertools的Python项目详细描述


Build StatusBuild statuscodecovCodacy BadgeDocumentation StatusPyPI

python使用wheel格式来简化包的分发。然而, 它不允许分发为每台计算机优化的包,但允许分发高度兼容的包。 用户必须自己编译包以利用simd(sse,avx,fma,…)等优化。

CompilerTools允许解决此问题,并为多台计算机分发优化包,同时保持 轮子的简单。它在后台工作,并且是为了易于使用而创建的。 包维护器只需要在运行时和构建时导入它。对最终用户来说一切都是透明的。

它的第二个目标也是帮助包维护者用多个编译器优化编译它的包。 为他配置选项。

文档:

Compilertools Documentation

特点:

  • 在一个单轮包中为各种机器编译和分发优化的二进制文件。
  • 帮助从当前计算机的源构建优化包。
  • 处理各种编译器的自动编译和链接选项。
  • 在源代码中自动检测openmp、openacc或intel cilk plus,并自动设置相关的编译和链接 选项。
  • 支持额外的编译选项,如快速数学。
  • 为包维护程序提供生成时设置以调整编译。
  • 提供获取当前计算机CPU信息的API。
  • 轻量级纯python模块,不依赖于尽可能使用惰性导入和求值。

怎么回事?

编译器工具根据当前使用的编译器和目标动态设置链接选项和编译选项 建筑。

这样可以避免在源文件或安装文件中指定编译器特定的选项。

多体系结构优化编译用于分发

在生成时:

编译器工具有助于为每个体系结构和带有标记后缀的名称文件优化“.so“/.pyd”:

示例:

  • module.avx2.cp36-win_amd64.pyd->;针对avx2 simd扩展的优化变体
  • module.avx.cp36-win_amd64.pyd->;针对avx simd扩展的优化变体
  • module.cp36-win_amd64.pyd->;经典的高度兼容变体

这些优化的文件在分发时打包在同一个控制盘中(不需要逐个变量创建控制盘)。

要求:

  • 在正常生成模块之前导入compilertools.build
  • 可以在compilertools.build.CONFIG_BUILD字典中直接更改选项。

运行时:

编译器工具根据CPU信息检测并选择最佳优化的“.so“/.pyd”运行。

如果不存在最佳文件,则搜索第二最佳文件等。如果找不到,请使用高度兼容的。

要求:

  • 在导入优化模块之前导入compilertools(这将向python添加一个新的导入挂钩)。

当前架构优化编译

CompilerTools为当前体系结构和当前编译器找到最佳的编译器选项,并且只生成一个 优化的“.so“/.pyd”,具有经典名称。

要求:

  • 在正常生成模块之前导入compilertools.build

而且…

OpenMP、OpenAcc、Intel Cilk Plus API自动检测: 编译器工具在源文件中搜索api pragma预处理器调用并启用编译器和链接器选项 如果需要的话。

额外的通用编译器选项: compilertools可以启用或禁用像fast math这样的通用额外编译器选项。

兼容性

支持的编译器

CompilerTools实现对以下编译器的支持:

  • 海合会
  • llvm叮当声
  • 微软Visual C++

支持的处理器

编译器工具实现对以下CPU的支持:

  • x86(32和64位)

生成工具兼容性

编译器工具已使用以下生成工具进行了测试:

  • distutils
  • 设置工具
  • numpy.distutils
  • 赛顿

python兼容性

  • Python3.4最低。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java实现的一个简单算法(计算概率)   更改应用程序背景动画的java首选项   java捕获图像并通过socket发送   基于双精度数组的对象的java排序Arraylist?   java似乎无法获得前面数字的正确总和   java卡住了Tomcat线程。日食乐观锁定   java是一个异步的Throwable类的printStackTrace()   java随机错误(可能是)Android支持库   java我应该在代码中自动创建DB表,还是在安装过程中使用preinit?   在被调用的方法/函数Java/Android中处理异常?   arraylist Java发送电子邮件非法分号?   while循环中的Java数组   java Arquillian和TransactionAttribute类型。需要新的   java“未找到合适的驱动程序”获取此错误   java高性能地将子类转换为真正的超类   java如何从另一个活动访问变量   安卓 Java Kotlin泛型将类getter作为参数传递到函数中   尝试访问数组的某个位置时需要java“]”