Saya kira kinerja tidak terlalu penting di sini, tetapi saya tidak bisa menolak. Fungsi zip () sepenuhnya menyalin kedua vektor (sebenarnya lebih merupakan transpose matriks) hanya untuk mendapatkan data dalam urutan "Pythonic". Akan menarik untuk mengatur waktu implementasi mur-dan-baut:
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
Itu melewati noise seperti C dari mengekstraksi elemen satu per satu, tetapi tidak melakukan penyalinan array massal dan menyelesaikan semua yang penting dalam satu perulangan for, dan menggunakan satu akar kuadrat.
ETA: Panggilan cetak yang diperbarui menjadi sebuah fungsi. (Yang asli adalah Python 2.7, bukan 3.3. Arus berjalan di bawah Python 2.7 dengan from __future__ import print_function
pernyataan.) Outputnya sama.
CPYthon 2.7.3 pada 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
Jadi, cara unpythonic sekitar 3,6 kali lebih cepat dalam kasus ini.