2013-02-08 16 views
13

पर पायथन सूची मैं जानना चाहता हूं कि सामान्य पायथन सूची को सीथॉन के साथ सी सूची में कैसे परिवर्तित करें, इसे संसाधित करें और एक पायथन सूची लौटाएं। जैसा:साइथन

पायथॉन लिपि:

import mymodule 

a = [1,2,3,4,5,6] 
len = len(a) 
print(mymodule.process(a,len)) 

Cython लिपि (mymodule.pyd):

cpdef process(a, int len): 
    cdef float y 
    for i in range(len): 
     y = a[i] 
     a[i] = y * 2 
    return a 

मैं MemoryView के बारे में पढ़ा और कई अन्य चीजें, लेकिन मैं वास्तव में unterstand नहीं क्या होने और का एक बहुत उदाहरण Numpy का उपयोग करें (मैं इसे अपनी स्क्रिप्ट के उपयोगकर्ता से बचने के लिए इसका उपयोग नहीं करना चाहता हूं एक बड़ा पैकेज डाउनलोड करें ... वैसे भी मुझे लगता है कि यह मेरे सॉफ़्टवेयर के साथ काम नहीं करता है)। वास्तव में क्या हो रहा है यह समझने के लिए मुझे वास्तव में एक सरल उदाहरण चाहिए।

+0

आपने 'a' का प्रकार क्यों घोषित नहीं किया है? –

+0

@ IgnacioVazquez-Abrams यह मेरी समस्या है। यह एक अजगर सरणी है ... मुझे नहीं पता कि इसे साइथन सरणी के रूप में कैसे घोषित किया जाए या इसे कैसे परिवर्तित किया जाए। यह एक साधारण उदाहरण है, वास्तव में मेरी अंतिम लिपि नहीं। मैं समझना चाहता हूं कि लोग मेरे लिए मेरी स्क्रिप्ट कैसे परिवर्तित नहीं करते हैं :) –

+0

यह एक सरणी नहीं है, यह एक सूची है। –

उत्तर

21

आपको सूची की सामग्री को स्पष्ट रूप से एक सरणी में कॉपी करने की आवश्यकता होगी। उदाहरण के लिए ...

cimport cython 
from libc.stdlib cimport malloc, free 

... 

def process(a, int len): 

    cdef int *my_ints 

    my_ints = <int *>malloc(len(a)*cython.sizeof(int)) 
    if my_ints is NULL: 
     raise MemoryError() 

    for i in xrange(len(a)): 
     my_ints[i] = a[i] 

    with nogil: 
     #Once you convert all of your Python types to C types, then you can release the GIL and do the real work 
     ... 
     free(my_ints) 

    #convert back to python return type 
    return value 
+0

और आप एक [i] = my_ints [i] की तरह उलटा के साथ एक और लूप करके पाइथन में वापस कनवर्ट कर सकते हैं? अगर मैं अच्छी तरह से समझता हूं। और मेरे लूप को" y = my_ints [ i] my_ints [i] = y * 2 "जहां आपने" ... "कहा है? इस सवाल के लिए खेद है, मैं वास्तव में साइथन के साथ नया हूं और प्रोग्रामिंग में वास्तव में अग्रिम नहीं हूं। लेकिन सीखने के लिए प्रेरित :) –

+1

ठीक है यह अच्छी तरह से काम कर रहा है । प्रदर्शन (8x) में शायद अच्छी वृद्धि नहीं है क्योंकि शायद इसे सरल ऑपरेशन करने के लिए इसे बदलने के लिए बहुत समय लगता है जैसे कि इसे 2 गुणा करें। क्या आप मुझे बता सकते हैं कि मॉलोक के साथ वास्तव में क्या करना है? और नोगिल का उपयोग क्यों करें? प्रदर्शन में वृद्धि? –

+1

malloc() एक सी मानक लाइब्रेरी फ़ंक्शन गतिशील रूप से ढेर पर स्मृति आवंटित करने के लिए है। यहां प्रारंभ करें: http://en.wikipedia.org/wiki/Malloc –

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