从 cython 生成随机数

计算科学 Python 随机数生成 智者
2021-11-25 09:43:49

我想通过使用 cython 使我的 python 程序快速运行,但我的内部循环仍在对随机数生成器进行缓慢的 python 调用!几年前,同样的问题是由圣人支持的人提出的,当时似乎没有好的解决方案。预先生成一长串随机样本对我来说并不方便,因为我实际上是从各种分布中抽样的,其方式取决于以前的样本。

这是一篇博客文章,解释了如何通过从 cython 连接到 gsl 来解决这个问题:http:
//pyinsci.blogspot.com/2010/12/efficient-mcmc-in-python-errata-and.html

还有一个试图实现gsl kludge的人的stackoverflow帖子:
https ://stackoverflow.com/questions/8177446/random-number-generators-to-work-on-x86-64

3个回答

Cython 通过消除类型歧义使代码更快。由于 random.py 是一个纯 python 模块,您可以复制它并将类型添加到您需要的函数中。然后 cython 可以优化掉动态开销。

按照 aterrel 的建议,您可以使用pyximport自动编译random模块

import pyximport
pyximport.install(pyimport=True)

import random

但是,这仍然不会像在 Cython 中为变量声明静态类型那样快。

我不确定这些是否是最近添加的,但似乎现在有一些简单的方法可以快速生成随机数而不会产生太多开销。这篇关于 cython 中的蒙特卡洛模拟的文章中,我们可以做到

from libc.stdlib cimport rand, RAND_MAX
r = 1 + int(rand()/(RAND_MAX*6.0)) # random integer 1,...,6

据我了解,您在编译时不需要做任何特别的事情。

为了测试期间的可重复性,您可以设置种子

# srand48(time(0)) # Do it this way in production
srand48(100) # For reproducibility in testing