Cythonからの乱数生成


8

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


質問が理解できません。Cython + GSL RNGはまさにこれを実装する方法です。何を変えたいですか?
Aron Ahmadia 2012

@Aron:多分それが私の質問への答えでしょう-Cython + GSL RNGはそれを行うための最良の方法です。別に何をしたいですか?余分なgsl依存関係を避け、それにリンクすることに関するボイラープレートを避けたいのですが、これに対するテクノロジーがまだ存在していない可能性があることを理解しています。しかし、私はそのために取り組んでいると楽観的に思っています。たとえば、github.com/twiecki/CythonGSLのようなプロジェクトで
なし

回答:


7

Cythonは、型のあいまいさを取り除くことにより、コードを高速化します。random.pyは純粋なPythonモジュールなので、コピーして、必要な関数に型を追加するだけです。次に、cythonは動的オーバーヘッドを最適化します。


私は実際にnumpy.randomを使用していますが、これは、使用しているパッケージのコードをコピーしてcythonizeするという興味深い提案です。
なし


2

これらが最近追加されたかどうかはわかりませんが、あまりオーバーヘッドをかけずに乱数をすばやく生成する簡単な方法があるようです。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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.