使用g++flag编译时,这些对数组和向量求和的函数之间似乎存在性能差异-O3:
float sum1(float* v, int length) {
float sum = 0;
for(int i = 0; i < length; i++) {
sum += v[i];
}
return sum;
}
float sum2(std::vector<float> v) {
return sum1(&v[0], v.size());
}
Run Code Online (Sandbox Code Playgroud)
当sum1使用例如长度为 100000 和sum2具有相同长度和内容的向量调用时,sum2最终大约为。比sum1我的测试慢 10% 。测量的运行时间是:
sum1: 0.279816 ms
sum2: 0.307811 ms
Run Code Online (Sandbox Code Playgroud)
现在这个开销从何而来?附加您还可以找到我在那里犯错误的可能性的完整测试代码。
[更新]通过引用 ( float sum2(std::vector<float>& v))调用时,性能差异约为 . 还剩下 3.7%,所以这会有所帮助,但在其他地方仍有一些性能损失?
[更新 2]其余的似乎在统计上占主导地位,从更多的迭代中可以看出。因此,唯一的问题确实是通过引用调用!
完整的测试代码(编译标志-O3与g++,也与测试clang++):
sum1: …Run Code Online (Sandbox Code Playgroud) 我会假设:
import numpy as np
a = np.array(["a", "b", "c"])
print(a == "abc")
print("abc" == a)
Run Code Online (Sandbox Code Playgroud)
输出
[False False False]
False
Run Code Online (Sandbox Code Playgroud)
,因为后者的比较应该为字符串使用相等的定义,而前者的比较应该为NumPy数组使用相等的定义。
实际输出为:
[False False False]
[False False False]
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况[1],如何防止这种情况发生[2]?
[1]即为什么str.__eq__ NotImplemented?
[2]也就是说,如果np.ndarray.__eq__不执行,如何调用执行的相等性检查?
[编辑]该问题被标记为与elementwise比较字符串1-d numpy数组可能重复,但不是,因为提出了完全相反的要求(基本上是如何使用np.ndarray.__eq__),并且[1]和[2]都不是讨论过。
arrays ×1
c++ ×1
equality ×1
operators ×1
performance ×1
python ×1
python-3.x ×1
stdvector ×1
vector ×1