【问题标题】:How to perform cython files compilation in parallel?如何并行执行 cython 文件编译?
【发布时间】:2016-10-27 02:25:09
【问题描述】:

我想并行执行cython 文件编译。

所以,我查看Cython.Build 源文件,并找到cythonize 函数的以下签名:

def cythonize(module_list, exclude=None, nthreads=0, aliases=None,
              quiet=False, force=False, language=None,
              exclude_failures=False, **options):

还有以下关于 cythonize nthreads 选项的评论:

"For parallel compilation, set the 'nthreads' option to the number of
concurrent builds."

所以我尝试在我的setup.py 文件中使用这个选项,就像这样:

from setuptools import setup
from Cython.Build import cythonize
from Cython.Distutils.extension import Extension

EXTENSIONS = [Extension(...)
              ...
              Extension(...)]

setup(name='...',
      ...
      ext_modules=cythonize(EXTENSIONS, nthreads=8),
      ...)

但我的.pyx 文件仍然使用 1 个线程按顺序编译。

我不明白我在这里做错了什么以及如何使用nthreads 选项并行执行cythonize 编译?

【问题讨论】:

    标签: python python-2.7 cython cythonize


    【解决方案1】:

    Cython 构建是一个两步过程:

    1. source.py 到 source.c
    2. source.c 到 source.o

    cythonize()nthreads 参数控制第一个进程的并发性,但不控制第二个进程。

    对于第二个进程build_ext 采用-j 参数来控制构建的并发性,因此您可以像这样加快构建速度:

    python setup.py build_ext -j 4

    或者如果你正在建造一个轮子,你可以使用:

    python setup.py build_ext -j 4 bdist_wheel

    【讨论】:

    • 你能把文档链接到这个答案吗? build_ext 的所有参数是什么?
    【解决方案2】:

    我终于找到了并行编译我的cython文件的解决方案:

    from setuptools import setup
    from Cython.Build import cythonize
    from Cython.Distutils.extension import Extension
    
    NB_COMPILE_JOBS = 8
    
    EXTENSIONS = [Extension(...)
                  ...
                  Extension(...)]
    
    def setup_given_extensions(extensions):
        setup(name='...',
              ...
              ext_modules=cythonize(extensions),
              ...)
    
    def setup_extensions_in_sequential():
        setup_given_extensions(EXTENSIONS)
    
    def setup_extensions_in_parallel():
        cythonize(EXTENSIONS, nthreads=NB_COMPILE_JOBS)
        pool = multiprocessing.Pool(processes=NB_COMPILE_JOBS)
        pool.map(setup_given_extensions, EXTENSIONS)
        pool.close()
        pool.join()
    
    if "build_ext" in sys.argv:
        setup_extensions_in_parallel()
    else:
        setup_extensions_in_sequential()
    

    【讨论】:

    • 在多个并行进程中运行setup(..),会不会有一些意想不到的副作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2015-02-20
    • 2023-03-10
    • 2016-05-08
    相关资源
    最近更新 更多