用C ++加速Python

时间:2015-06-24 09:50:17

标签: python c++ ctypes

我试图通过使用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()。

2 个答案:

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

我希望这会有所帮助。

关于您的代码:它可能没问题,但我会将sumi取消签名。您可以将const添加到数组参数类型,但编译器肯定能够自己解决这个问题。  哦,我认为你应该删除floor。整数除法已经这样做了。