Tôi không cho rằng hiệu suất quan trọng ở đây, nhưng tôi không thể cưỡng lại. Hàm zip () hoàn toàn sao chép lại cả hai vectơ (thực ra là chuyển vị ma trận) chỉ để lấy dữ liệu theo thứ tự "Pythonic". Sẽ rất thú vị khi thời gian thực hiện các đai ốc:
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
Điều đó vượt qua tiếng ồn giống như C của việc trích xuất từng phần tử một, nhưng không sao chép mảng hàng loạt và hoàn thành mọi thứ quan trọng trong một vòng lặp for duy nhất và sử dụng một căn bậc hai.
ETA: Cuộc gọi in được cập nhật thành một hàm. (Bản gốc là Python 2.7, không phải 3.3. Hiện tại chạy dưới Python 2.7 vớifrom __future__ import print_function
câu lệnh.) Đầu ra giống nhau.
CPYthon 2.7.3 trên 3.0GHz Core 2 Duo:
>>> 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
Vì vậy, cách unpythonic nhanh hơn khoảng 3,6 lần trong trường hợp này.