比较这两个短代码的计算速度

时间:2018-01-25 12:21:16

标签: python algorithm performance numpy

在代码的两个版本中,v1和v2都是大向量(长度范围从1,000 1,000,000到len(v1)= len(v2))。我希望代码2 代码1 更强大,但事实证明代码1 要快得多,我不知道为什么。你能解释为什么代码2 很慢吗?谢谢。

代码1:

norm1=math.sqrt(np.dot(v1,v1))
norm2=math.sqrt(np.dot(v2,v2))
kern=np.dot(v1,v2)/(norm1*norm2)

代码2:

kern=0
for i in range(0, len(v1)):
    kern+=min(v1[i], v2[i])

2 个答案:

答案 0 :(得分:5)

np.dot()调用还需要通过向量进行循环,但这些循环(通常)是在C ++中本地实现的。与基于C ++的循环相比,在python中显式实现的循环(如代码2中所示)的速度非常慢。

答案 1 :(得分:2)

在第一个代码中,您使用的是标准库<android.support.v4.widget.NestedScrollView android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" android:layout_gravity="fill_vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:id="@+id/serviceView" android:layout_width="match_parent" app:layout_anchor="@+id/tab_layout" app:layout_anchorGravity="bottom" android:layout_gravity="bottom" android:layout_height="wrap_content" android:scrollbars="vertical" /> </android.support.v4.widget.NestedScrollView> 中的函数。这些是高度优化的库,可以更快地进行计算,因为在C. refer this

中实现了

在第二个代码中,伴随着numpy循环的开销,每次迭代循环时函数调用for的开销也会被添加,并且不会忘记{{1}的开销}。