在代码的两个版本中,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])
答案 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}的开销}。