tạo số ngẫu nhiên từ cython


8

Tôi muốn làm cho chương trình python của mình nhanh bằng cách sử dụng cython, nhưng vòng lặp bên trong của tôi vẫn thực hiện các cuộc gọi python chậm đến trình tạo số ngẫu nhiên! Vài năm trước, vấn đề tương tự đã được đưa ra bởi một người ủng hộ hiền triết và dường như không có giải pháp tốt tại thời điểm đó. Nó không thuận tiện cho tôi để tạo trước một danh sách dài các mẫu ngẫu nhiên vì tôi thực sự đang lấy mẫu từ các bản phân phối khác nhau theo cách có điều kiện trên các mẫu trước đó.

Đây là một bài đăng trên blog giải thích làm thế nào điều này bị loại bỏ bằng cách kết nối từ cython với gsl:
http://pyinsci.blogspot.com/2010/12/ffic-mcmc-in-python-errata-and.html

Và một bài đăng stackoverflow bởi ai đó đang cố gắng thực hiện gsl kydge:
/programming/8177446/random-number-generators-to-work-on-x86-64


Tôi không hiểu câu hỏi của bạn. Cython + GSL RNG chính xác là cách tôi sẽ thực hiện điều này. Bạn muốn gì khác nhau?
Aron Ahmadia

@Aron: Có lẽ đó là câu trả lời cho câu hỏi của tôi - rằng Cython + GSL RNG vẫn là cách tốt nhất để làm điều đó. Tôi muốn làm gì khác nhau? Tôi muốn tránh sự phụ thuộc gsl thêm và tránh các nồi hơi liên quan đến liên kết với nó, nhưng tôi hiểu rằng công nghệ cho việc này có thể chưa tồn tại. Nhưng tôi lạc quan rằng chúng tôi đang làm việc hướng tới nó, ví dụ như với các dự án như github.com/twiecki/CythonGSL .
không có

Câu trả lời:


7

Cython làm cho mã nhanh hơn bằng cách loại bỏ sự mơ hồ kiểu. Vì Random.py là một mô-đun python thuần, bạn chỉ cần sao chép nó và thêm các loại vào các chức năng bạn cần. Sau đó, cython có thể tối ưu hóa chi phí năng động đi.


Tôi thực sự đang sử dụng numpy.random nhưng đây là một gợi ý thú vị để sao chép và mã hóa mã trong các gói mà tôi đang sử dụng.
không có

5

Theo đề xuất của aterrel, bạn có thể sử dụng pyximportđể tự động biên dịch randommô-đun :

import pyximport
pyximport.install(pyimport=True)

import random

Tuy nhiên, điều này vẫn sẽ không làm cho nó nhanh như nó sẽ xảy ra nếu bạn khai báo các kiểu tĩnh cho các biến trong Cython.


1
Chào mừng đến với trang web, Jim! Cảm ơn vì đầu vào ngoài cổng tuyệt vời :)
Aron Ahmadia

2

Tôi không chắc chắn nếu những thứ này được thêm vào gần đây nhưng có vẻ như bây giờ có những cách dễ dàng để tạo số ngẫu nhiên một cách nhanh chóng mà không cần quá nhiều chi phí. Từ bài viết này về mô phỏng Monte Carlo trong cython chúng ta có thể làm

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

Theo tôi hiểu bạn không cần phải làm gì đặc biệt khi biên dịch.

Để tái sản xuất trong quá trình thử nghiệm, bạn có thể đặt hạt giống

# srand48(time(0)) # Do it this way in production
srand48(100) # For reproducibility in testing
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.