【问题标题】:Is there any way to make Python random sum code faster in Cython?有什么方法可以让 Python 随机和代码在 Cython 中更快?
【发布时间】:2020-04-07 04:14:58
【问题描述】:

我写了一段代码,它从均匀分布中抽取随机数,对它们求和,直到达到一个数字 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

我想尽可能加快速度

【问题讨论】:

  • 你知道np.cos(theta) 有一半是负数吗?

标签: python optimization jupyter cython


【解决方案1】:

在不使用 Cython 的情况下,可以加快速度的一种方法是减少调用 np.random.uniform 的频率。调用此函数并返回 1 个值与 100,000 个值的成本可以忽略不计,调用它并返回 1,000 个值与调用 1,000 次会节省大量时间:

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

【讨论】:

    猜你喜欢
    • 2020-06-02
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多