আমি মনে করি না এখানে পারফরম্যান্সের বিষয়টি খুব বেশি, তবে আমি প্রতিরোধ করতে পারি না। জিপ () ফাংশনটি কেবলমাত্র "পাইথোনিক" ক্রমে ডেটা পাওয়ার জন্য উভয় ভেক্টরকে (একটি ম্যাট্রিক্স ট্রান্সপোজের বেশি, আসলে) সম্পূর্ণরূপে পুনরায় সংগ্রহ করে। বাদাম এবং বোল্ট বাস্তবায়নের সময়টি আকর্ষণীয় হবে:
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
এটি একসাথে এক সময় উপাদানগুলি বের করার সি-জাতীয় শব্দের মধ্য দিয়ে যায়, তবে কোনও বাল্ক অ্যারে অনুলিপি করে না এবং লুপের জন্য একক মধ্যে গুরুত্বপূর্ণ সমস্ত কাজ করে এবং একক বর্গমূল ব্যবহার করে।
ইটিএ: একটি ফাংশন হতে আপডেট হওয়া মুদ্রণ কল। (মূলটি পাইথন ২.7 ছিল, ৩.৩ নয়। বর্তমানটি পাইথন ২.7 এর অধীনে একটি from __future__ import print_function
বিবৃতি দিয়ে চালিত হয় ।) আউটপুট উভয় দিক থেকেই একই রকম।
সিপিওয়াইথন ২.7.৩ এ 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 গুণ বেশি দ্রুত।