用C++加速Python

2024-09-28 23:33:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过使用Cype来加速Python脚本,将一些重举部分外包给C++。在

我用一个小例子(返回x^2)运行得很好,但是现在是时候在这个配置中设置我的函数了。在

我的问题是,如何在C++中很好地编写Python代码的函数,以确保它尽可能快,我不愿意认为我可能无法得到任何速度增加,仅仅因为我的副C++。在

def shortTermEnergy(frame):
    return sum( [ abs(x)**2 for x in frame ] ) / len(frame)

我将通过^ {< CD1>}作为数组,使用^ {CD2>}将它从列表转换为C++的/P>的漂亮数组

我希望这是最好的做法,我没有遗漏任何明显的东西?自从我写了C++以来,一直是一个很长的时间。在

谢谢

编辑

我已经用这个C++代码了,请告诉我是否有改进的方法。在

^{pr2}$

其中size是从Python传递的数组的len()。在


Tags: 函数代码脚本forlenreturndefabs
2条回答
对不起,没有明确回答你的问题,但是我认为一个简单的解决方案会更容易实现,并且可以提高速度,几乎和C++片段一样好:

import numpy as np
frame = np.random.random_sample(10000)

def shortTermEnergy(frame):
    return sum( [ abs(x)**2 for x in frame ] ) / len(frame)

>> %timeit shortTermEnergy(frame)
>> 100 loops, best of 3: 4.11 ms per loop


def dot_product(frame):
    return np.dot(frame, frame)/frame.size

>> %timeit dot_product(frame):
>> 10000 loops, best of 3: 19.3 µs per loop

我会这么说:

template<class MeanT, class AccumT = MeanT, class IterT>
MeanT mean_squares(IterT start, IterT end) {
  AccumT accum = 0;
  for (IterT it = start; it != end; ++it) {
    accum += *it * *it;
  }
  return accum / (end - start);
}

我省略了abs,因为它不是必需的。但是编译器能够更好地优化无符号乘法。在

使用方法如下:

^{pr2}$

我希望这有帮助。在

关于您的代码:可能没问题,不过我会让sum和{}无符号。您可以将const添加到数组参数类型中,但是编译器肯定能够自己解决这个问题。 哦,我想你应该把它去掉。整数除法已经做到了。在

相关问题 更多 >