OpenCVのPythonバインディングとC++の速度比較

OpenCVのPythonバインディングはC++で書いた場合に比べてどれくらい遅いのか気になったので適当に調べて見ました。
一番速度差が出そうな要素アクセスをするコードでテストしました。

環境

Mac OS X 10.7.2
OpenCV 2.3.1a
Python 2.7.1
Apple LLVM compiler 3.0

C++

Mat gradation(1000, 1000, CV_8UC3);

for (int y = 0; y < gradation.rows; y++) {
  Vec3b *p = &gradation.at<Vec3b>(y, 0);
  for (int x = 0; x < gradation.cols; x++) {
    (*p)[0] = (int)(255.0 * y / gradation.rows);
    (*p)[1] = (int)(255.0 * x / gradation.cols);
    (*p)[2] = (int)(255.0 * x / gradation.cols);
    
    p++;
  }
}

imwrite("/Users/ryota/opencvtestCpp.tiff", gradation);

Python

import timeit

if __name__ == '__main__':
  t = timeit.Timer('''
  import cv
  import math
  gradation = cv.CreateMat(1000, 1000, cv.CV_8UC3)

  for y in xrange(gradation.rows):
    for x in xrange(gradation.cols):
      gradation[y, x] = (math.floor(255.0 * y / gradation.rows), math.floor(255.0 * x / gradation.rows), math.floor(255.0 * x / gradation.rows))

  cv.SaveImage("/Users/ryota/opencvtextPython.tiff", gradation)
  ''')
  print t.timeit(2)

結果

[sec] Python C++ C++/Python 比
(1)5000×5000 36.58 1.33 27.47
(2)1000×1000 1.59 0.07 23.67
(1)/(2) 比 22.96 19.78

適当な考察

Pythonの場合はC++の場合の25倍程度の時間がかかっています。
これは厳しいですね。
ただ、今回のテストで使用したコードが最適でないかもしれないので…
もし高速なコードがありましたら教えていただけると助かります。