6

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

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

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

以下是关于 cythonizenthreads选项的评论:

"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

4

2 回答 2

11

Cython 构建是一个两步过程:

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

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

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

python setup.py build_ext -j 4

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

python setup.py build_ext -j 4 bdist_wheel

于 2020-04-08T15:42:38.403 回答
6

我终于找到了一个并行编译我的 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()
于 2016-11-10T16:53:15.477 回答