मुझे नहीं लगता कि यहां प्रदर्शन का महत्व ज्यादा है, लेकिन मैं विरोध नहीं कर सकता। जिप () फ़ंक्शन पूरी तरह से दोनों वैक्टर (मैट्रिक्स ट्रांसजेंड का अधिक, वास्तव में) को केवल "पायथोनिक" क्रम में डेटा प्राप्त करने के लिए फिर से खोल देता है। यह नट-और-बोल्ट कार्यान्वयन के समय के लिए दिलचस्प होगा:
import math
def cosine_similarity(v1,v2):
"compute cosine similarity of v1 to v2: (v1 dot v2)/{||v1||*||v2||)"
sumxx, sumxy, sumyy = 0, 0, 0
for i in range(len(v1)):
x = v1[i]; y = v2[i]
sumxx += x*x
sumyy += y*y
sumxy += x*y
return sumxy/math.sqrt(sumxx*sumyy)
v1,v2 = [3, 45, 7, 2], [2, 54, 13, 15]
print(v1, v2, cosine_similarity(v1,v2))
Output: [3, 45, 7, 2] [2, 54, 13, 15] 0.972284251712
तत्वों को एक बार में निकालने के सी-लाइक शोर के माध्यम से जाता है, लेकिन कोई भी थोक सरणी की नकल नहीं करता है और लूप के लिए एक ही बार में सब कुछ महत्वपूर्ण हो जाता है, और एक एकल वर्गमूल का उपयोग करता है।
ETA: एक फ़ंक्शन होने के लिए अद्यतित प्रिंट कॉल। (मूल पायथन 2.7 था, 3.3 नहीं। एक from __future__ import print_function
बयान के साथ पायथन 2.7 के तहत वर्तमान रन ।) आउटपुट एक ही है, किसी भी तरह से।
सीपीयूथॉन 2.7.3 3.0GHz कोर 2 डुओ पर:
>>> timeit.timeit("cosine_similarity(v1,v2)",setup="from __main__ import cosine_similarity, v1, v2")
2.4261788514654654
>>> timeit.timeit("cosine_measure(v1,v2)",setup="from __main__ import cosine_measure, v1, v2")
8.794677709375264
तो, इस मामले में अब तक खौफनाक तरीका लगभग 3.6 गुना तेज है।