मैं अन्य काम के लिए तैयारी में Cython के साथ प्रयोग करना किया गया है बनाम। मैंने एक साधारण परीक्षण मामले की कोशिश की और बड़े कोड आकार के लिए मेरे कोड के तरीके के साथ कुछ अजीब देखा। मैंने एक साधारण न्यूनतम/अधिकतम फ़ंक्शन बनाया जो 2 डी फ्लोट 32 सरणी के न्यूनतम और अधिकतम की गणना करता है और इसे numpy.min(a), numpy.max(a)
चलाने के लिए तुलना करता है। 10000 तत्वों की एक सरणी के लिए प्रदर्शन समान था। 1000000 तत्वों की एक सरणी के लिए साइथन ने बहुत खराब प्रदर्शन किया। यहाँ मेरी सरल समय IPython में किया हैCython numpy के प्रदर्शन का आकलन
import numpy
cimport cython
cimport numpy
DTYPE = numpy.float32
ctypedef numpy.float32_t DTYPE_t
@cython.boundscheck(False)
@cython.wraparound(False)
def minmax_float32(numpy.ndarray[DTYPE_t, ndim=2] arr):
cdef DTYPE_t min = arr[0, 0]
cdef DTYPE_t max = arr[0, 0]
cdef int row_max = arr.shape[0]
cdef int col_max = arr.shape[1]
cdef int x, y
for y in range(row_max):
for x in range(col_max):
if arr[y, x] < min:
min = arr[y, x]
if arr[y, x] > max:
max = arr[y, x]
return min, max
और: यहाँ मेरी cython कोड है
a = numpy.random.random(10000).reshape((100, 100)).astype(numpy.float32)
%timeit -r3 -n50 (numpy.min(a), numpy.max(a))
# 50 loops, best of 3: 22.2 µs per loop
%timeit -r3 -n50 minmax_float32(a)
# 50 loops, best of 3: 23.8 µs per loop
a = numpy.random.random(1000000).reshape((1000, 1000)).astype(numpy.float32)
%timeit -r3 -n50 (numpy.min(a), numpy.max(a))
# 50 loops, best of 3: 307 µs per loop
%timeit -r3 -n50 minmax_float32(a)
# 50 loops, best of 3: 1.22 ms per loop
307/22.2
# 13.82882882882883
1220/23.8
# 51.26050420168067
किसी को भी क्यों cython बड़ा इनपुट के लिए इतना समय लगता है के लिए विचार है? और यह वही था जो मैं खेल रहा था, लेकिन अगर आपके पास कोई सुझाव या चाल है तो मुझे उनकी सुनवाई में दिलचस्पी है। अग्रिम में धन्यवाद।
संपादित करें: मैं स्मृति के 8GB के साथ एक मैकबुक 10.10 पर इन परीक्षणों भाग गया। अपने ट्यूटोरियल -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing
में उल्लिखित झंडे के साथ मैकपोर्ट्स से जीसीसी के साथ साइथन को संकलित किया।
अगर आप अपने आंतरिक और बाहरी छोरों फ्लिप क्या होता है? – mtrw
अच्छा सवाल, यह ~ 7ms तक चला जाता है। मैंने जो कुछ किया वह दो 'लाइनों' को बदल गया था। – daveydave400
मेरा अनुमान है कि कि संकलक ठीक से autovectorize के लिए संघर्ष कर सकती है - [इस] (https://groups.google.com/d/msg/cython-users/LfBH6M7gNTc/B19uFB5YbYYJ)। –