ฉันไม่คิดว่าประสิทธิภาพจะสำคัญมากที่นี่ แต่ฉันไม่สามารถต้านทานได้ ฟังก์ชั่น zip () จะคัดลอกเวกเตอร์ทั้งสองอย่างสมบูรณ์ (มากกว่าการเปลี่ยนเมทริกซ์จริงๆ) เพียงเพื่อให้ได้ข้อมูลในลำดับ "Pythonic" มันน่าสนใจที่จะใช้เวลาในการใช้งานแบบถั่วและสลักเกลียว:
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
ซึ่งจะผ่านสัญญาณรบกวนแบบ C ของการแยกองค์ประกอบทีละรายการ แต่ไม่มีการคัดลอกอาร์เรย์จำนวนมากและทำให้ทุกอย่างที่สำคัญเสร็จสิ้นในครั้งเดียวสำหรับลูปและใช้สแควร์รูทเดียว
ETA: อัปเดตการเรียกพิมพ์เป็นฟังก์ชัน (ต้นฉบับคือ Python 2.7 ไม่ใช่ 3.3 ปัจจุบันทำงานภายใต้ Python 2.7 พร้อมกับfrom __future__ import print_function
คำสั่ง) เอาต์พุตจะเหมือนกันไม่ว่าจะด้วยวิธีใดก็ตาม
CPYthon 2.7.3 บน 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
ดังนั้นวิธี unpythonic จะเร็วขึ้นประมาณ 3.6 เท่าในกรณีนี้