我试图通过使用ctypes将一些重大提升外包给C ++来加速Python脚本。
我有一个小例子(返回x ^ 2),但是现在是时候在这个配置中设置我的功能了。
我的问题是,如何在C ++中很好地编写Python代码的这个函数以确保它尽可能快,我不愿意认为我可能不会提高速度,仅仅因为我的C ++。 / p>
def shortTermEnergy(frame):
return sum( [ abs(x)**2 for x in frame ] ) / len(frame)
我将frame
作为数组传递,使用arr = (ctypes.c_int * len(frame))(*frame)
将其从列表转换为适合C ++的精美数组
我希望这是最好的做法,我不会错过任何明显的东西吗?自从我写了任何C ++以来,这是很长的时间。
由于
修改
目前我已经使用了这个C ++代码,如果有方法可以改进,请告诉我。
#include <cmath>
extern "C" int square(int size, int array[])
{
int sum = 0;
for (int i = 0; i < size; i++)
{
int number = array[i];
int value = (number * number);
sum = sum + value;
}
return floor(sum / size);
}
其中size
是从Python传递的数组的len()。
答案 0 :(得分:3)
很抱歉没有明确回答你的问题,但我认为一个简单的解决方案会更容易实现,并且可以提高速度几乎与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
答案 1 :(得分:2)
我会这样做:
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
,因为没有必要。但它可能是编译器能够更好地优化无符号乘法。
使用是这样的:
double result = mean_squares<double, unsigned long>(array, array + length);
// std::begin(vect), std::end(vect) in case of an STL vector
我希望这会有所帮助。
关于您的代码:它可能没问题,但我会将sum
和i
取消签名。您可以将const
添加到数组参数类型,但编译器肯定能够自己解决这个问题。
哦,我认为你应该删除floor
。整数除法已经这样做了。