Saya mencoba mempercepat jawabannya di sini menggunakan Cython. Saya mencoba mengkompilasi kode (setelah melakukan cygwinccompiler.py
peretasan dijelaskan di sini ), tetapi mendapatkan fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated
kesalahan. Adakah yang bisa memberi tahu saya jika ada masalah dengan kode saya, atau beberapa kehalusan esoterik dengan Cython?
Di bawah ini adalah kode saya.
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()
Jawaban:
Di Anda
setup.py
,Extension
harus memiliki argumeninclude_dirs=[numpy.get_include()]
.Juga, Anda kehilangan
np.import_array()
kode Anda.-
Contoh setup.py:
sumber
np.import_array()
? Bukankah itu untuk C-API Numpy ?warning: untitled.pyx:8:49: Buffer unpacking not optimized away.
np.import_array()
. Saya jarang menulis ekstensi Cython numpy menggunakan tanpa itu, jadi saya menggunakannya sebagai kebiasaan. Adapun masalah Anda yang lain, apa yang Anda kutip hanyalah peringatan, bukan kesalahan. Jika Anda memiliki kesalahan lain yang perlu diperbaiki, silakan buat posting baru.include_dirs=[numpy.get_include()]
adalah trik yang bagus terima kasih!include_dirs
dilewatkan untuksetup()
diabaikan dalam distutils terbaru, itu harus diteruskan ke masing - masingExtension
, setidaknya pada macUntuk proyek satu-file seperti milik Anda, alternatif lain adalah menggunakan
pyximport
. Anda tidak perlu membuatsetup.py
... Anda bahkan tidak perlu membuka baris perintah jika Anda menggunakan IPython ... semuanya sangat nyaman. Dalam kasus Anda, coba jalankan perintah ini dalam IPython atau dalam skrip Python normal:Anda mungkin perlu mengedit kompiler tentu saja. Ini membuat impor dan memuat ulang berfungsi sama untuk
.pyx
file seperti mereka bekerja untuk.py
file.Sumber: http://wiki.cython.org/InstalingOnWindows
sumber
pyximport
memengaruhi kecepatan kode saya? Dan akhirnya, bagian di sini: " Sejak Cython 0.11, modul pyximport juga memiliki dukungan kompilasi eksperimental untuk modul Python normal ..." menyiratkan bahwa ia masih memiliki beberapa kekusutan untuk dikerjakan. Bisakah Anda menjelaskannya juga?.py
modul dikompilasi secara normal (bukan dengan cython) sementara.pyx
modul dikompilasi dengan cython. Jika Andapyimport = True
masukpyximport.install()
, maka ia akan menggunakan cython untuk semuanya, bahkan untuk contohimport random
atauimport os
. Saya tidak menyarankan menggunakan fitur itu, hanya karena tidak ada alasan kuat untuk menggunakannya, dan itu bisa membuat masalah. Ini mungkin digunakan terutama oleh pengembang cython.pyximport
berhasil, itu akan membuat kode C yang sama persis seperti metode lainnya. Jadi cobalah dan lihat. Saya merujuk pada fakta bahwa ketika proses kompilasi cukup rumit, misalnya tautan ke pustaka sistem eksternal, Anda mungkin menemukan bahwa pyximport gagal dan Anda perlusetup.py
dancythonize
untuk menentukan cara membuatnya secara tepat. Tetapi fakta bahwa.pyx
modul Anda memilikiimport
s ataucimport
s tidak berarti bahwa ia tidak dapat dikompilasi denganpyximport
; mungkin baik-baik saja.Kesalahan berarti bahwa file header numpy tidak ditemukan selama kompilasi.
Coba lakukan
export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/
, dan kemudian kompilasi. Ini adalah masalah dengan beberapa paket berbeda. Ada bug yang diajukan di ArchLinux untuk masalah yang sama: https://bugs.archlinux.org/task/22326sumber
export
baris? Dalamsetup.py
file saya ?python setup.py
) jalankanexport ..
perintah terlebih dahulu. Ini mengatur variabel lingkungan dari shell, tidak ada hubungannya langsung dengan [pc] ython.'export' is not recognized as an internal or external command, operable program or batch file.
kesalahan ini ... tidak bisa menang dengan yang ini ...Jawaban sederhana
Cara yang lebih sederhana adalah menambahkan path ke file Anda
distutils.cfg
. Itu nama path Windows 7 secara defaultC:\Python27\Lib\distutils\
. Anda hanya menegaskan konten berikut dan itu akan berhasil:Seluruh file konfigurasi
Untuk memberi Anda contoh bagaimana tampilan file konfigurasi, seluruh file saya berbunyi:
sumber
Seharusnya bisa melakukannya dalam
cythonize()
fungsi seperti yang disebutkan di sini , tetapi tidak berfungsi karena ada masalah yang diketahuisumber
Jika Anda terlalu malas untuk menulis file setup dan mencari jalan untuk menyertakan direktori, coba cyper . Itu dapat mengkompilasi kode Cython Anda dan ditetapkan
include_dirs
untuk Numpy secara otomatis.Muat kode Anda ke dalam string, kemudian jalankan
cymodule = cyper.inline(code_string)
, maka fungsi Anda tersedia secaracymodule.sparsemaker
instan. Sesuatu seperti iniAnda dapat menginstal cyper via
pip install cyper
.sumber