2011-03-22 16 views
19

के लिए हैश नम्पी ऑब्जेक्ट्स का तेज़ तरीका एक प्रणाली को कार्यान्वित करना, जहां भारी गणितीय उठाने की बात आती है, मैं जितना संभव हो उतना करना चाहता हूं।कैशिंग

मुझे पता है कि numpy वस्तुओं के साथ memoisation के साथ समस्याएं हैं, और इस तरह पूरे "समयपूर्व अनुकूलन" तर्क से बचने के लिए एक आलसी कुंजी कैश लागू किया।

def magic(numpyarg,intarg): 
    key = str(numpyarg)+str(intarg) 

    try: 
     ret = self._cache[key] 
     return ret 
    except: 
     pass 

    ... here be dragons ... 
    self._cache[key]=value 
    return value 

लेकिन जब से स्ट्रिंग रूपांतरण काफी कुछ समय लगता है ...

t=timeit.Timer("str(a)","import numpy;a=numpy.random.rand(10,10)") 
t.timeit(number=100000)/100000 = 0.00132s/call 

क्या लोगों को 'बेहतर तरीका' यह करने के लिए किया जा रहा है के रूप में सुझाव है कि करते हैं?

+0

पाइथन में एक बड़ी वस्तु (डेटासेट) हैश के संभावित डुप्लिकेट?] (Http://stackoverflow.com/questions/806151/how-to-hash-a-large-object- डेटासेट-in-python) – tacaswell

उत्तर

23

this answer से उधार ली गई है ... इसलिए वास्तव में मुझे लगता है कि यह डुप्लिकेट है:

>>> import hashlib 
>>> import numpy 
>>> a = numpy.random.rand(10, 100) 
>>> b = a.view(numpy.uint8) 
>>> hashlib.sha1(b).hexdigest() 
'15c61fba5c969e5ed12cee619551881be908f11b' 
>>> t=timeit.Timer("hashlib.sha1(a.view(numpy.uint8)).hexdigest()", 
        "import hashlib;import numpy;a=numpy.random.rand(10,10)") 
>>> t.timeit(number=10000)/10000 
2.5790500640869139e-05 
+3

अच्छा! बहुआयामी सरणी के लिए यह एक अलग हैश ("समान" सरणी के लिए) देता है कि यह फोर्ट्रान या सी संगत है या नहीं। यदि यह कोई समस्या है, तो 'np.ascontiguousarray' को कॉल करना इसे हल करना चाहिए। – jorgeca

+0

सुनिश्चित नहीं है कि ज्ञात धीमी हैश फ़ंक्शन 'sha1' क्यों चुना जाता है। एसएचए -1 हैश टकराव को कम करने के लिए ठीक है लेकिन गति पर खराब है। गति के लिए आपको 'murmurhash' या' xxhash' जैसे कुछ की आवश्यकता होगी (बाद का दावा भी तेज होगा)। –

+0

@ कॉंगमा, अतिरिक्त जानकारी के लिए धन्यवाद। बहुत सारे विकल्प हैं! लेकिन जैसा कि आप देखेंगे, यह पहले से ही परिमाण के दो आदेश तेजी से है। और गति कभी _only_ चिंता नहीं है। यह संभवतः एक अच्छी तरह से समझने वाले हैश का उपयोग करने लायक है यदि विकल्प केवल दूसरे के कुछ मिलियनवां है। – senderle

5

इस joblib के लिए एक पैकेज है। this प्रश्न से मिला।

2

छोटे NumPy सरणी के लिए भी इस उपयुक्त हो सकता है:

tuple(map(float, a)) 

अगर a numpy सरणी है।

+0

ओह हाँ, सूची के मुकाबले टुपल हैशबल है! –

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