我写了一段编码,从均匀分布中提取随机数,将它们累加直到达到L = x。 我曾尝试使用Cython对其进行优化,但是我想对如何进一步优化提出任何建议,因为它将被要求使用较大的L值,因此将花费很长时间。 这是我到目前为止在Jupyter中编写的代码
%%cython
import numpy as np
cimport numpy
import numpy.random
def f(int L):
cdef double r=0
cdef int i=0
cdef float theta
while r<=L:
theta=np.random.uniform(0, 2*np.pi, size = None)
r+=np.cos(theta)
i+=1
return i
我想尽可能地加快速度
答案 0 :(得分:1)
在不使用Cython的情况下,可以加快此速度的一种方法是不太频繁地调用np.random.uniform。调用此函数并返回1个值与100,000个值的成本可以忽略不计,调用并返回1,000个值与调用1000次相比,可节省大量时间:
def call1000():
return [np.random.uniform(0, 2*np.pi, size = None) for i in range(1000)]
%timeit call1000()
762 µs ± 3.11 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.random.uniform(0, 2*np.pi, size = 1000)
10.8 µs ± 13.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
您可以执行以下操作,并确保不会用完以下值:
def f(L):
r = 0
i = 0
j = 0
theta = np.random.uniform(0, 2*np.pi, size = 100000)
while r<=L:
if j == len(theta):
j=0
theta=np.random.uniform(0, 2*np.pi, size = 100000)
r+=np.cos(theta[j])
i+=1
return i