C++コードのインライン埋め込み

from scipy import *
converters = weave.converters

def weave_func(x):
  y = zeros(x.shape, dtype=x.dtype)
  code = """
  for(int i=0; i < Nx[0]; i++) {
    y(i) = sin(x(i)) * cos(x(i));
  }
  """
  # use blitz array for C++
  weave.inline(code, ['x', 'y'], type_converters=converters.blitz)
  return y

def py_func(x):
  return sin(x) * cos(x)

x = arange(0.0, 2*pi, 0.02)
y1 = weave_func(x)
y2 = py_func(x)

weave_funcとpy_funcは同じ計算を実行している。
weave_funcではC++のコード(codeという文字列がインラインで実行されるC++のコード)が必要な時には自動的にコンパイルされて実行される。

py_funcでもループはCで実行されるが、かけ算や足し算の度に一時オブジェクトが生成されるので効率が悪くなる。それに対してweave_funcではそれがない。ただしC++のコードの呼び出しオーバーヘッドがかかるので一概に高速化になるかどうかは定かでは無い。

ちなみに配列をblitzの配列オブジェクトではなく普通のポインタとして使うことも可能。この方が早いらしいが、何かとblitzの方が便利。

http://www.scipy.org/PerformanceTips参照のこと。