我想用cython在并行上下文中生成随机值。我有一些cpp代码,我不知道如何在cython中转换(或从cpp文件导入(
我的cpp代码是:
#include <random>
static std::random_device rand_device;
static std::mt19937 rnd_gen(rand_device());
static std::uniform_real_distribution<> rnd_unif(0, 1);
我想用这些代码行定义一个cpp文件,但我可以在cython文件中写些什么来导入和使用它?
我看到在cython中生成随机数的规范方法来自一个类似的问题,但它总是生成相同的数字
从那里我需要做这样的设置:
from distutils.core import setup
from Cython.Build import cythonize
import numpy
setup(
name="cyvmc",
version="1.0",
packages=["cyvmc"],
ext_modules=cythonize(["cyvmc/*.pyx"]),
include_dirs=[numpy.get_include()],
)
此安装程序将找到cpp文件:我正确吗?
在那之后,我不知道如何导入cpp文件以供cython使用我对c++不熟悉。如果我只使用这4行代码,我需要创建一个rand.h吗
如注释中所述,从Cython 3.0.0a11开始,C++STL<random>
已经被封装,并且是Cython模块libcpp.random
的一部分。您只需要更新您的Cython版本,即pip3 install cython==3.0.0a11
。
这是一个最小工作example.pyx
:
# distutils: language = c++
from libcpp.random cimport random_device, mt19937, uniform_real_distribution
def foo():
cdef random_device dev
cdef mt19937 rnd_gen = mt19937(dev())
cdef uniform_real_distribution[double] rnd_unif = uniform_real_distribution[double](0, 1)
# create one random_value
return rnd_unif(rnd_gen)
那么,您不需要在setup.py
中包含任何头文件。只需将其安装为常规*.pyx文件即可。