我有2个长度相同的x和y字形和一个输入数a.我想找到计算第三个列表z的最快方法,例如:

  • z[0] = a
  • z[i] = z[i-1]*(1+x[i]) + y[i]

不使用这样的循环:

a = 213
x = pd.DataFrame({'RandomNumber': np.random.rand(200)})
y = pd.DataFrame({'RandomNumber': np.random.rand(200)})
z = pd.Series(index=x.index, dtype=float)
z[0] = a
for i in range(1,len(x.index)):
    z[i] = z[i-1]*(1+x.iloc[i]) + y.iloc[i]

推荐答案

您无法真正将此功能进行载体化,操作的开发变得过于复杂.

例如,用z[i-1]的函数表示的z[i+1]等于:

z[i-1]*(1+x[i])+y[i] + z[i]*(x[i+1]+x[i]*x[i+1]) + y[i]*x[i] + y[i+1]

每走一步,情况就会变得更糟

正如 comments 中建议的那样,如果速度是一个问题,您可以使用numba:

from numba import jit

@jit(nopython=True)
def f(a, x, y):
    out = [a]
    for i in range(1, len(x)):
        out.append(out[i-1] * (1 + x[i]) + y[i])
    return out

out = pd.Series(f(213, x['RandomNumber'].to_numpy(), y['RandomNumber'].to_numpy()), index=x.index)

输出(使用np.random.seed(0)行和5行):

0     213.000000
1     365.772922
2     587.139217
3     908.025165
4    1293.097825
dtype: float64

定时 ( 200 行 ) :

# python loop
59.8 ms ± 908 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

# numba
151 µs ± 968 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

Python相关问答推荐

Python tkinter关闭第一个窗口,同时打开第二个窗口

Pandas 按照特殊规则保留每n行

在Python中使用一行try

如何从格式为note:{neighbor:weight}的字典中构建networkx图?

Plotly:如何更改Heatmap中彩色条的勾选文本

Tkinter -控制调色板的位置

从webhook中的短代码(而不是电话号码)接收Twilio消息

试图找到Python方法来部分填充numpy数组

从dict的列中分钟

C#使用程序从Python中执行Exec文件

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

如何使用pytest来查看Python中是否存在class attribution属性?

DataFrames与NaN的条件乘法

对象的`__call__`方法的setattr在Python中不起作用'

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

Python+线程\TrocessPoolExecutor

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

在单个对象中解析多个Python数据帧

字符串合并语法在哪里记录

Flask Jinja2如果语句总是计算为false&