有什么方法可以使Cython中的Python随机和代码更快?

时间:2020-04-06 10:03:16

标签: python optimization jupyter cython

我写了一段编码,从均匀分布中提取随机数,将它们累加直到达到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

我想尽可能地加快速度

1 个答案:

答案 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