1

Python コードのパフォーマンスを向上させるために scipy.weave を使用しています。基本的に、長い配列 (1024^3,3) を通過する必要があります。つまり、1024^3 要素を含み、各要素に 3 つのエントリがある配列です。要素ごとにいくつかのことを計算してから、別の配列に入力します。

問題は、配列が ~(850**3,3) より大きい場合にセグメンテーション違反が発生することです。位置 (a,3) で配列の値を読み取ろうとすると、セグメンテーション違反が発生します。ここで、a = 715827882 です。3*a ~ 2^31 であることに注意してください。この問題を注意深く調査しましたが、整数変数のサイズよりも長い長さの配列を処理できないようです。

実はこの簡単なプログラムは

################################
import numpy as np
import scipy.weave as wv

def printf():

    a=3*1024**3

    support = """
          #include <iostream>
          using namespace std;
    """

    code = """
        cout << a << endl;
    """
    wv.inline(code,['a'],
              type_converters = wv.converters.blitz,
              support_code = support,libraries = ['m'])

printf()
#########################################

3221225472の代わりに-1073741824を出力します。これは、変数aがcコードでは64ビットではなく32ビットの整数として取られることを意味します(私は思います)。

これを解決する方法を知っている人はいますか?もちろん、配列を 2^31 より小さいサイズに分割することしかできませんが、これは非常に非効率的であることがわかりました。

ありがとう。

4

0 に答える 0