Я пытаюсь ускорить ответ здесь с помощью Cython. Я пытаюсь скомпилировать код (после выполнения cygwinccompiler.py
описанного здесь взлома ), но получаю сообщение fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated
об ошибке. Может ли кто-нибудь сказать мне, проблема ли это в моем коде или в какой-то эзотерической тонкости Cython?
Ниже мой код.
import numpy as np
import scipy as sp
cimport numpy as np
cimport cython
cdef inline np.ndarray[np.int, ndim=1] fbincount(np.ndarray[np.int_t, ndim=1] x):
cdef int m = np.amax(x)+1
cdef int n = x.size
cdef unsigned int i
cdef np.ndarray[np.int_t, ndim=1] c = np.zeros(m, dtype=np.int)
for i in xrange(n):
c[<unsigned int>x[i]] += 1
return c
cdef packed struct Point:
np.float64_t f0, f1
@cython.boundscheck(False)
def sparsemaker(np.ndarray[np.float_t, ndim=2] X not None,
np.ndarray[np.float_t, ndim=2] Y not None,
np.ndarray[np.float_t, ndim=2] Z not None):
cdef np.ndarray[np.float64_t, ndim=1] counts, factor
cdef np.ndarray[np.int_t, ndim=1] row, col, repeats
cdef np.ndarray[Point] indices
cdef int x_, y_
_, row = np.unique(X, return_inverse=True); x_ = _.size
_, col = np.unique(Y, return_inverse=True); y_ = _.size
indices = np.rec.fromarrays([row,col])
_, repeats = np.unique(indices, return_inverse=True)
counts = 1. / fbincount(repeats)
Z.flat *= counts.take(repeats)
return sp.sparse.csr_matrix((Z.flat,(row,col)), shape=(x_, y_)).toarray()
Ответы:
В ваших
setup.py
, тоExtension
должен иметь аргументinclude_dirs=[numpy.get_include()]
.Кроме того, вам не хватает
np.import_array()
кода.-
Пример setup.py:
источник
np.import_array()
? Разве это не для Numpy C-API ?warning: untitled.pyx:8:49: Buffer unpacking not optimized away.
np.import_array()
. Однако я редко пишу расширения Cython, использующие numpy, без него, поэтому я использую его по привычке. Что касается другой вашей проблемы, то, что вы процитировали, является просто предупреждением, а не ошибкой. Если у вас есть другие ошибки, которые необходимо исправить, напишите новое сообщение.include_dirs=[numpy.get_include()]
это хороший трюк, спасибо!include_dirs
переданныйsetup()
игнорируется в последних distutils, он должен быть передан каждомуExtension
, по крайней мере, на MacДля однофайлового проекта, подобного вашему, другой альтернативой является использование
pyximport
. Вам не нужно создаватьsetup.py
... вам даже не нужно открывать командную строку, если вы используете IPython ... все это очень удобно. В вашем случае попробуйте запустить эти команды в IPython или в обычном скрипте Python:Конечно, вам может потребоваться отредактировать компилятор. Это заставляет импорт и перезагрузку работать с
.pyx
файлами так же, как с.py
файлами.Источник: http://wiki.cython.org/InstallingOnWindows
источник
pyximport
влияет на скорость моего кода? И, наконец, раздел здесь: « Начиная с Cython 0.11, модуль pyximport также имеет экспериментальную поддержку компиляции для обычных модулей Python ...» подразумевает, что в нем все еще есть некоторые проблемы, над которыми нужно работать. Вы тоже можете это объяснить?.py
модули компилируются нормально (не с помощью cython), а.pyx
модули компилируются с помощью cython. Если вы перейдетеpyimport = True
вpyximport.install()
, тогда он будет использовать cython для всего, даже напримерimport random
илиimport os
. Я не предлагаю использовать эту функцию просто потому, что нет веских причин для ее использования, и это может создать проблемы. Вероятно, он используется в основном разработчиками cython.pyximport
вообще работает, он создаст тот же код C, что и любой другой метод. Так что попробуйте и убедитесь. Я имел в виду тот факт, что когда процесс компиляции достаточно сложен, например, ссылки на внешние системные библиотеки, вы можете обнаружить, что pyximport не работает, и вам понадобитсяsetup.py
и,cythonize
чтобы точно указать, как его построить. Но тот факт, что ваш.pyx
модуль имеетimport
s илиcimport
s, не означает, что он не может быть скомпилированpyximport
; это вполне может быть совершенно нормально.Ошибка означает, что файл заголовка numpy не найден во время компиляции.
Попробуй сделать
export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/
, а потом скомпилировать. Это проблема нескольких разных пакетов. В ArchLinux есть ошибка по той же проблеме: https://bugs.archlinux.org/task/22326источник
export
строчку? В моемsetup.py
файле?python setup.py
)export ..
сначала запустите команду. Он устанавливает переменные окружения оболочки, но не имеет ничего общего с [pc] ython.'export' is not recognized as an internal or external command, operable program or batch file.
ошибку ... просто не могу победить с этим ...Простой ответ
Более простой способ - добавить путь к вашему файлу
distutils.cfg
. Это путь от имени Windows 7 по умолчаниюC:\Python27\Lib\distutils\
. Вы просто утверждаете следующее содержание, и оно должно сработать:Весь конфигурационный файл
Чтобы дать вам пример того, как может выглядеть файл конфигурации, весь мой файл гласит:
источник
Он должен иметь возможность делать это в рамках
cythonize()
упомянутой здесь функции , но это не работает, поскольку существует известная проблема.источник
Если вам лень писать установочные файлы и выяснять путь для включаемых каталогов, попробуйте cyper . Он может скомпилировать ваш код Cython и
include_dirs
автоматически установить для Numpy.Загрузите свой код в строку, затем просто запустите
cymodule = cyper.inline(code_string)
, и ваша функция будет доступнаcymodule.sparsemaker
мгновенно. Что-то вроде этогоВы можете установить cyper через
pip install cyper
.источник