如何并行执行cython文件编译?
How to perform cython files compilation in parallel?
我想并行执行 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
编译?
我终于找到了并行编译我的 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()
Cython 构建是一个两步过程:
- source.py 到 source.c
- 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
以防万一有人需要在多线程中构建包含许多 cython 文件的 wheel 包。
python3 setup.py build_ext -j {N} bdist_wheel
其中 {N} 是线程数。
我想并行执行 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
编译?
我终于找到了并行编译我的 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()
Cython 构建是一个两步过程:
- source.py 到 source.c
- 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
以防万一有人需要在多线程中构建包含许多 cython 文件的 wheel 包。
python3 setup.py build_ext -j {N} bdist_wheel
其中 {N} 是线程数。