Axe*_*rja 4 python cython python-2.7 cythonize
我想cython并行执行文件编译。
因此,我看一下Cython.Build源文件,并找到以下cythonize函数签名:
def cythonize(module_list, exclude=None, nthreads=0, aliases=None,
quiet=False, force=False, language=None,
exclude_failures=False, **options):
Run Code Online (Sandbox Code Playgroud)
关于cythonize nthreads选项的以下评论:
"For parallel compilation, set the 'nthreads' option to the number of
concurrent builds."
Run Code Online (Sandbox Code Playgroud)
因此,我尝试在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),
...)
Run Code Online (Sandbox Code Playgroud)
但是我的.pyx文件仍然使用1个线程顺序编译。
我不明白我在这里做错了什么,以及如何使用nthreadsoption来cythonize并行执行编译?
小智 8
Cython 构建是一个两步过程:
的nthreads参数来cythonize()控制所述第一过程的并发性,而不是第二。
对于第二个过程build_ext需要一个-j参数来控制构建的并发性,因此您可以像这样加快构建速度:
python setup.py build_ext -j 4
或者,如果您正在构建一个轮子,您可以使用:
python setup.py build_ext -j 4 bdist_wheel
我终于找到了一种并行编译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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1299 次 |
| 最近记录: |