2012-01-10 12 views
20

मैं एक न्यूमपी सदस्य के साथ एक साइथन "सीडीएफ" ऑब्जेक्ट रखना चाहता हूं, और तेज़ बफर एक्सेस का उपयोग करने में सक्षम हूं।ऑब्जेक्ट सदस्यों के लिए साइथन बफर घोषणाएं

import numpy as np 
cimport numpy as np 

cdef class Model: 
    cdef np.ndarray[np.int_t, ndim=1] A 

    def sum(self): 
    cdef int i, s=0, N=len(self.A) 
    for 0 <= i < N: 
     s += self.A[i] 
    return s 

    def __init__(self): 
    self.A = np.arange(1000) 

दुर्भाग्य से, Cython इस त्रुटि Buffer types only allowed as function local variables साथ संकलन नहीं कर सकते,: आदर्श रूप में, मैं कुछ की तरह करना होगा।

वैकल्पिक हल मैं उपयोग कर रहा हूँ बफर घोषित करने के लिए है एक नया स्थानीय चर पर जिम्मेदार बताते हैं, वस्तु सदस्य को सौंपा:

cdef class Model: 
    cdef np.ndarray A 

    def sum(self): 
    cdef int i, s=0, N=len(self.A) 
    cdef np.ndarray[np.int_t, ndim=1] A = self.A 
    for 0 <= i < N: 
     s += A[i] 
    return s 

यह वास्तव में कष्टप्रद हो जाता है अगर आप एक ही डेटा तक पहुँचने के लिए कई तरीकों करना चाहते हैं संरचनाएं - जो एक बहुत ही सामान्य उपयोग मामले की तरह दिखती हैं, नहीं?

क्या कोई बेहतर समाधान है जिसके लिए प्रत्येक विधि के भीतर प्रकारों को फिर से घोषित करने की आवश्यकता नहीं है?

उत्तर

6

जो समाधान आप वर्तमान में उपयोग कर रहे हैं वह वह है जो मैं उपयोग करता हूं, यानी फ़ंक्शन में स्थानीय प्रतिलिपि बनाते हैं। यह सुरुचिपूर्ण नहीं है, लेकिन मुझे नहीं लगता कि आप एक बड़ा प्रदर्शन हिट लेते हैं (या कम से कम मेरे मामले में, मैं विधि में बहुत सारे काम कर रहा हूं, इसलिए यह एक स्पष्ट अंतर नहीं बनाता है)। मैंने __cinit__ विधि में एक सी-सरणी भी बनाई है और फिर इसे __init__ में डेटा से भर दिया है (सुनिश्चित करें कि आप ठीक से साफ करने के लिए __dealloc__ का उपयोग करें)। आप numpy सरणी की कुछ विशेषताओं को खो देते हैं, लेकिन आप अभी भी इसका उपयोग कर सकते हैं क्योंकि आप एक सी-सरणी करेंगे।

तुम भी cython सूची पर इस पुराने ईमेल में चर्चा की जाँच हो सकता है:

http://codespeak.net/pipermail/cython-dev/2009-April/005214.html

+2

अद्यतन के साथ काम करने का विकल्प भी नहीं है लिंक http://www.mail-archive.com/[email protected]/msg05166.html – gg349

+0

क्या यह प्रदर्शन खो सकता है? – machen

13

स्मृति स्लाइस या cython सरणियों http://docs.cython.org/src/userguide/memoryviews.html

import numpy as np 
cimport numpy as np 

    cdef class Model: 

    cdef int [:] A 

    def sum(self): 

     for 0 <= i < N: 
      s += self.A[i] 
     return s 

    def __init__(self): 
     self.A = np.arange(1000) 
+0

जब आप इस मेमोरीव्यू दृष्टिकोण का उपयोग करते हैं, तो आप प्रदर्शन खो सकते हैं ?? मैं इसे प्रोफाइल करता हूं: स्ट्रिंगसोर्स: 368 (__ dealloc__) और स्ट्रिंगसोर्स: 341 (__ cinit__)। वैसे, इस पर भी चर्चा की गई है https://stackoverflow.com/questions/21056696/when-profiling-cython-code-what-is-stringsource – machen

+0

इस आवश्यकता के मुद्दे के बारे में सुरुचिपूर्ण समाधान क्या है? – machen

संबंधित मुद्दे