1

cython の関数に 65535 より大きい値を渡した数値の奇妙な動作を認識しました。しかし、これはこれらの数値を関数に渡した場合にのみ表示されます。私がそれらを次のように定義すると

cdef long long a = 145574697

すべて正常に動作します。私の問題を明確にするために、この問題を調査するために使用した2つのダミー関数を渡します

def bigNum1():
    cdef long long a = 500000
    cdef long long b = 10547746498
    cdef long long c = 65536
    cdef long long d = 65535
    print(a, b, c, d)


def bigNum2(long long a, long long b, long long c, long long d):
    print(a, b, c, d)

そして、「.pyd」ファイルを取得するために呼び出された「setup.py」。

from distutils.core import setup
from Cython.Build import cythonize


setup(
    ext_modules = cythonize("bigNumbers.pyx")
)

その後、コマンドで「.pyd」ファイルを作成しました

python setup.py build_ext --inplace

コマンドプロンプトを使用します。使用した c コンパイラは gcc です。

次に「bigNum1」または「bigNum2」のいずれかを呼び出すと、次の出力が得られます。

bigNum1: (500000, 10547746498, 65536, 65535)
bigNum2: (41248, 442029762, 0, 65535).

ご覧のとおり、bigNum2 を使用すると、65535 より大きいすべての数値が正しく表示されません。続いて、この関数の呼び出しを確認します。

import bigNumbers

bigNumbers.bigNum1()

a = 500000
b = 10547746498
c = 65536
d = 65535


bigNumbers.bigNum2(a, b, c, d)

私の問題を理解していただければ幸いです。私の推測では、bigNum2 で間違った宣言を行った結果、間違った型になったか、このメソッドに数値を渡す前に何らかの型キャストを行う必要があると思います。

編集:

これは、コマンド プロンプトの処理中に表示されるテキストです。

python setup.py build_ext --inplace
Compiling bigNumbers.pyx because it changed.
[1/1] Cythonizing bigNumbers.pyx
running build_ext
building 'bigNumbers' extension
D:\WinPython3610\cgg64Bit\bin\gcc.exe -mdll -O -Wall -ID:\WinPython3610\python-3
.6.1.amd64\include -ID:\WinPython3610\python-3.6.1.amd64\include -c bigNumbers.c
 -o build\temp.win-amd64-3.6\Release\bignumbers.o
writing build\temp.win-amd64-3.6\Release\bigNumbers.cp36-win_amd64.def
D:\WinPython3610\cgg64Bit\bin\gcc.exe -shared -s build\temp.win-amd64-3.6\Releas
e\bignumbers.o build\temp.win-amd64-3.6\Release\bigNumbers.cp36-win_amd64.def -L
D:\WinPython3610\python-3.6.1.amd64\libs -LD:\WinPython3610\python-3.6.1.amd64\P
Cbuild\amd64 -lpython36 -lvcruntime140 -o L:\User\neon3_worksp
ace\CythonSource\src\bigNumbers.cp36-win_amd64.pyd

EDIT2:

cython 0.25.2に付属のWinpythonパッケージ「WinPython 3.6.1.0Qt5-64bit」を使用しています。しかし、最新バージョンを取得するために pip でアップグレードしました。

まず、ここのチュートリアルを使用して .pyd を取得しようとしました。

http://docs.cython.org/en/latest/src/quickstart/build.html

しかし、ビルド中に「エラー: vcvarsall.bat が見つかりません」というエラー メッセージが表示されました。そのため、gcc で Mingw を使用することにしました。ただし、これにより、この投稿で説明されているエラーも作成されました。

ValueError: 不明な MS コンパイラ バージョン 1900

そして、Indrajit Kanjilal の回答で解決しました。そして、私たちは今そこにいます。.pyd ファイルを作成して関数を呼び出すことはできますが、値が 65535 より大きい場合、エラーが発生します。それが役立つことを願っています。

4

1 に答える 1